携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
- Flink双写
将所有Flink Job改写,在写入Elasticsearch的时候旁路输出一份数据到Kafka,并对复杂嵌套数据创建下游任务进行转化发送到Kafka,Doris使用Routine Load导入数据。
- 数据同步
原来我们使用ES的时候,由于很多表没有数据写入时间,数据分析师需要每天扫全表导出全量数据到Hive,这对我们的集群有很大压力,并且也会导致数据延迟上升,我们在引入了Doris后,对所有数仓表都添加 eventStamp, updateStamp, deleted这三个字段。
-
eventStamp:事件发生时间
-
updateStamp:Doris数据更新时间,在Routine Load中生成
-
deleted:数据是否删除,由于我们很多实时数仓需要定时同步到离线数仓,所以数据需要采取软删除的模式
-
数据对下游同步时可以灵活的选择eventStamp或者updateStamp进行增量同步。数据同步我们采用了多种方式,通过Hive表名后缀来决定不同同步场景:
-
_f:每天/每小时全量同步,基于Doris Export全量导出
-
_i:每天/每小时增量同步,基于Doris Export按分区导出/网易易数扫表导出
-
_d:每天镜像同步,基于Doris Export全量导出
-
指标域划分/数据分层
将Elasticsearch中的数据进行整理并结合后续的业务场景。
根据上面的指标域,我们基于星型模型开始构建实时数仓,在Doris中构建了20余张数仓底表以及10余张维表,通过网易易数构建了完整的指标系统。
- 微批生成DWS/ADS层
由于我们多数场景都是明细+聚合数据的分析,所以我们基于Doris insert into select的导入方式,实现了一套定时根据DWD层数据生成DWS/ADS层数据的逻辑,延迟最低可以支持到分钟级。
对于明细数据在TiDB或者ES的,我们选择了在Flink中进行窗口聚合写入到下游Doris或者ES中。而对于明细数据只在Doris单独存在的数据,由于我们大部分使用了异步写入的方式,所以数据无法立即可读,我们在外围构建了支持模版化配置的定时执行引擎,支持分钟/小时级别的扫描明细表变更写入下游聚合表。