1、刘迪珊美团基于流批一体构建增量数仓生产实践The Production Practice of Building Incremental Data Warehouse based on Unified Architecture at Meituan项目目标核心设计与实现计算能力优化未来展望#1#2#3#4#1项目目标数仓生产面临的问题#1离线实时两套计算逻辑,口径难统一:离线实时数据生产,采用两套技术栈,产出两套数据海量数据就绪时间难保证:对于天级海量数据,离线生产性能优化的空间近乎达到瓶颈实时生产准确性依赖状态容量:状态越大、快照制作和恢复的成本越高,时效性和准确性间权衡#2#345本期目标
2、:1)数仓生产时效性提升:T+1-分钟级,特征生产主流程落地2)建立同时支持批量和增量读写的存储引擎3)Flink支持对上述存储引擎的增量读写4)提升Flink在百万QPS/10TB状态下,流计算任务的处理能力和稳定性KafkaKafka事件服务Flink集成Flink实时增量存储SparkFlink增量增量存储Flink导出OLAP数仓增量生产目标离线数仓增量数仓#2核心设计与实现6需求背景7图片来自社区分享:https:/ Flink作为增量生产的计算引擎 Flink流批统一架构,一套代码、统一计算口径需求背景8明细层2 增量读写的必要性增量存储Flink增量存储Flink聚合层Flink
3、增量存储标签层增量读增量写 离线数仓分层划分,目标增量化表的上游链路上的所有节点也必须增量化需求背景93 批读的必要性Flink增量存储标签层Flink导出线上存储HDFS/HIVE增量读批读Spark线上特征生产增量化原BI下游保持批处理不变 终极目标:增量生产架构替换原有离线生产架构 增量生产架构:不是所有节点都一定是增量化的,而是这套架构能同时支持增量和批计算需求背景104 批写的必要性Flink增量存储标签层HDFS/HIVE增量写增量存储Flink批写存量数据增量数据 存量数据,批写初始化 数据修复,批量更新需求背景115 Upsert的必要性增量数据idvalue110022003
4、30044001001000idvalue1120221010110100存量数据idvalue112022103300440010110100最新数据 增量数据需要与全量数据进行merge 增量数据远少于全量数据,若不支持Upsert,读取全量数据效率低6 before/after的必要性+100,1,0,1+101,1,0,2-101,1,0,2+101,1,1,2changelog流KafkaFlink集成增量存储Flink增量增量存储idpay_status delivery_status poi100101101112UPDATE,100,1,0,1UPDATE,101,1,0,2U
5、PDATE,101,1,1,2CDC变更数据(binlog)输出:更新外存 id,pay_status,delivery_status,poiSELECT COUNT(id)AS cnt FROM orders WHERE pay_status=1 AND delivery_status!=1 GROUP BY poi;poicnt1120orders表(主键:id)poi表(主键:poi)UPDATE 1,1UPDATE 2,1UPDATE 2,0输出:更新外存 poi,cnt 增量生产的表既会作为结果查询,又会作为作为下游增量生产的输入 对于一个增量任务,为了保证结果数据的准确性,需要依赖
6、before/after进行回撤12需求背景需求背景137 事务的必要性(Exactly once)+100,1,0,1+101,1,0,2-101,1,0,2+101,1,1,2changelog流KafkaFlink集成增量存储Flink增量增量存储idpay_status delivery_status poi100101101112UPDATE,100,1,0,1UPDATE,101,1,0,2UPDATE,101,1,1,2CDC变更数据(binlog)输出:更新外存 id,pay_status,delivery_status,poiSELECT COUNT(id)AS cnt FR