实时数仓开发 - doris/pg/flink
业务场景描述 - 实时数仓
- 查询性能在毫秒级
- 业务数据可以随意修改、删除数据等操作
- 指标计算需求涉及跨多个表关联查询,4个union all [即5个select],涉及大表的json字符串解析与计算
- 存在json字符串解析,且解析后数据做聚合,再做差值
环境描述
doris 1.1
debezium - flink - doris 框架实现
doris - UNIQUE KEY 模式实现
实现思路1: flink 消费kafka明细数据到doris,表模型为UNIQUE KEY 模式,用普通视图包装ETL逻辑,供外部查询;但是经过验证发现查询性能在秒级,尝试进行慢sql优化。
针对慢sql的优化尝试:
- 使用rollup单表提前聚合,但是不支持按部分主键聚合;
- 优化表前缀索引,查询性能有所提升,但还是在秒级范围内;
- 把json字符串解析功能提前完成同时删除表无关字段;
结论: 同步明细数据到doris中ETL,数据查询性能无法达到预期的时间要求。【未解决问题】
实现思路2: flink 消费kafka明细数据经过ETL计算聚合后sink到doris,用普通视图包装ETL逻辑。
结论: 同步聚合数据到doris进行查询,数据查询性能达到预期的时间要求。
doris - AGGREGATE KEY 模式实现
1、flink 消费kafka明细数据经过ETL计算聚合后sink到doris,用普通视图包装ETL逻辑;
2、【flink 计算原理解析】flink 是有状态的计算,每次的输出都是把历史状态+当前状态的数据做逻辑计算后sink到目标表,因此非key字段要的value要设置为replace;此时的模式即是UNIQUE KEY模式的实现。【UNIQUE KEY仅是AGGREGATE KEY的一种特例形式】
结论: 同步聚合数据到doris进行查询,数据查询性能达到预期的时间要求。
debezium - flink - PostgreSQL 框架实现
实现思路:
flink 消费kafka明细数据,flink任务中数据聚合计算后同步到PostgreSQL数据库
结论: 同步聚合数据到doris进行查询,数据查询性能达到预期的时间要求。
doris 使用总结
尽量减少 delete/insert操作
1、delete/insert操作,性能较慢;建议减少deleted/insert操作或者加大批量写入。
作为key字段不能为null
- 要注意key字段不能为空,某一些业务场景可能作为key字段为null ,数据会写入失败。
key字段为null报错如下:
Column ‘birth_date’ is NOT NULL, however, a null value is being written into it. You can set job configuration ‘table.exec.sink.not-null-enforcer’=‘drop’ to suppress this exception and drop such records silently.
UNIQUE KEY 模式对rollup的支持
CREATE TABLE XXXX (
event_id bigint(20) NULL COMMENT "",
animal_id bigint(20) NULL COMMENT "",
org_id bigint(20) NULL COMMENT "",
pig_num bigint(20)
) ENGINE=OLAP
UNIQUE KEY(event_id, animal_id, org_id)
COMMENT "OLAP"
DISTRIBUTED BY HASH(org_id) BUCKETS 32
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"in_memory" = "false",
"storage_format" = "V2"
);
执行:
ALTER TABLE DB.XXX ADD ROLLUP r1(org_id, pig_num);
报错信息: SQL 错误 [1105] [HY000]: errCode = 2, detailMessage = Rollup should contains all unique keys in basetable
加入全部主键,没有问题:
ALTER TABLE test_bigdata_realtime_metrics.dwd_fpf_anc_event_list0727 ADD ROLLUP r1(event_id,org_id,animal_id, pig_num);
官网说是支持的,有兴趣可以查看:https://doris.apache.org/zh-CN/docs/data-table/hit-the-rollup/#aggregate-%E5%92%8C-unique-%E6%A8%A1%E5%9E%8B%E4%B8%AD%E7%9A%84-rollup
结论:UNIQUE KEY 模式不支持单一主键 rollup,必须包含表所有主键
AGGREGATE KEY 模式对rollup的支持
CREATE TABLE db.XXX (
event_id bigint(20) NULL COMMENT "",
animal_id bigint(20) NULL COMMENT "",
org_id bigint(20) NULL COMMENT "",
pig_num bigint(20) SUM
) ENGINE=OLAP
Aggregate KEY(event_id, animal_id, org_id)
COMMENT "OLAP"
DISTRIBUTED BY HASH(org_id) BUCKETS 32
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"in_memory" = "false",
"storage_format" = "V2"
);
使用单一主键创建 ROLLUP :
ALTER TABLE db.XXX ADD ROLLUP r1(org_id , pig_num);
结论: 执行成功,支持单一主键
AGGREGATE KEY 模式 - 验证insert/delete
建表语句
CREATE TABLE `dws_fmc_piglet_got_

本文探讨了如何通过Debezium-Flink框架将实时数据流聚合并写入Doris,比较了UNIQUEKEY与AGGREGATEKEY模式的性能与特性。重点讲述了如何优化查询性能,减少delete/insert操作,以及key字段选择和特殊字符串解析的问题。最后,总结了在Doris中使用的关键点和注意事项。

4万+

被折叠的 条评论
为什么被折叠?



