1、DataFunSummitDataFunSummit#20242024实时入湖实时入湖HudiHudi应用解决方案应用解决方案杨宣-华为-大数据开发工程师数据集成整体方案数据集成整体方案数据入湖通用方案数据入湖通用方案数据入湖进阶方案数据入湖进阶方案目录目录 CONTENTCONTENTDataFunSummitDataFunSummit#202420240101数据集成整体方案数据集成整体方案数据集成整体方案数据库文件消息队列批量集成Loder实时集成CDL消息队列JDBC直连CDC采集第三方工具实时采集Hive表Hudi表Spark/FlinkFTP服务批量集成LoderHive表实时集成
2、CDLSpark/FlinkHudi表非标准格式标准格式批量批量实时实时数据量大(百万到千万级)小(单表万级TPS)运行态周期常驻资源消耗周期性峰值高/低峰期时延分钟到小时级秒级批量入湖方案1.特点适用于存量数据搬迁补数增量对时效要求不高,比如T+12.挑战数据重复问题。数据库JDBC直连方式或者文件导出方式无法识别更新和删除,直接写入目标表会导致数据重复问题。JDBC直连方式读取数据库数据会受到底层网络资源的影响,JDBC协议通道也有限,大数据量场景该方式采集数据不仅效率低而且对业务库带来压力。文件入湖需要更多的上下游协同来保证完整性,依赖可以管理上下游任务调度的平台。对接消息管道批量入湖需
3、要关注数据老化时间,以防止丢失数据。3.推荐Hudi表(需要主键)拥有行级的更新能力,可以自动去重。建议对表进行分区,这样去重环节比较方便。在业务库网络通道充足且有备库的情况下,可用JDBC方式进行大数量采集。或者采用文件入湖来规避。文件入湖可以进行压缩上传和下载,降低网络通道消耗,可以采用flag标记文件的上传状态,确保文件完整性。消息管道批量入湖可以通过限流来保证入湖程序的稳定性,增加监控对消费终止和积压等进行告警,降低数据老化风险。实时入湖方案1.特点入湖频率高,单次数据量低,数据都是包含新增、更新和删除的过程数据,而非最终快照数据。业务需要快速的数据计算,满足业务的实时决策需求。任务常
4、驻,资源不释放,降低资源消耗峰值和源库压力。2.挑战Flink引擎直连数据源的方案单个流只能处理单个表,资源消耗大,无并发,吞吐量小。面对异常场景带来的问题,分析起来难度大,可靠性低。Spark引擎直连数据源的方案开发成本高。实时场景DDL和DML操作需要一定的有序性保证。实时场景对于数据存储模型的设计非常重要。3.推荐建议采用专业的CDC工具。它可以提供的可视化无代码的方式同步;单任务可以采集多表,资源复用,高吞吐;支持的数据源和目标存储格式丰富;最关键的是专业的CDC工具可以快速的从异常场景恢复,丢数风险低,有丰富的告警和监控来保证任务的可靠性。保证数据湖的DDL操作要早于业务库变更,可以
5、在入湖程序对关键表的数据格式进行检查,如字段增减、数据类型调整,发现异常程序立即退出并告警,保证数据质量。实时数据入湖只能采用Hudi格式的存储,特大表入湖推荐使用MOR表+Bucket索引+分区。Hudi表模型设计方案 类型入湖实时性要求高就选择MOR表。一般端到端的实时入湖性能要求都在分钟内。表字段的大小写以及字段类型在不同的引擎上都会有差别,建议统一字段大小写,调研各引擎之间字段类型的映射关系。索引如果业务涉及到多个引擎操作同一个Hudi表,要统一Hudi表的索引。Bucket索引适合Spark/Flink引擎交互操作。Bucket索引的分桶要合理,否则性能会下降。分区表一般建议按业务峰
6、值预估最大的分区未压缩前的数据量/2G 来分桶,非分区表建议按照业务峰值预估整表未压缩前的数据量/2G*2来分桶。状态索引建议在2亿数据量以下使用,Cow多数采用Simple索引(大表建议采用Bloom索引),MOR大数据量表建议Bucket索引。分区建议事实表采用日期分区表,维度表采用非分区或者粗粒度的日期分区表。分区要基于数据更新范围以及下游作业读取方位来确定。模式UpsertAppend快照表方案1.增量同步快照表2.全量同步快照表 场景小表+批量入湖源表物理删除 实现Truncate+InsertInsert Overwrite Table批量同步任务Hive增量临时表Hive快照表存