1、数据湖ICEBERG在小米的落地与实践小米-李培殿|目录目录CONTENT|01Iceberg 技术简介02Iceberg在小米的应用实践03基于 Iceberg 的流批一体的探索04未来规划Iceberg技术简介01|Iceberg 简介|Apache Iceberg is an open table format for huge analytic datasets.Iceberg adds tables to compute engines including Spark,Trino,PrestoDB,Flink and Hive using a high-performance tab
2、le format that works just like a SQL table.Iceberg 简介|存储与计算分离计算引擎选择更灵活屏蔽底层文件存储细节,对外暴露都是一张Iceberg表文件布局|Metadata(元数据文件)记录了最新的快照信息和历史快照信息,以及最新的Schema信息。Snapshot(快照文件)每次事务提交都会生成一个Snapshot。记录了本次提交新增的清单文件和历史清单文件列表(Manifest List)。Manifest(清单文件)记录了本次事务写入的文件和分区的对应关系,以及字段统计信息(最大值、最小值)。Data File(数据文件)实际写入的数据文件
3、,如Parquet、Avro等格式文件。事务性|避免脏数据读写分离隐式分区|根据数据自动推断分区分区不和目录强绑定灵活的分区变更行级更新|format version更新方式更新方式V1Copy On WriteV2Copy On Write、Merge On ReadIceberg在小米的应用实践02|数据湖在小米应用现状|表数量表数量4000+数据量数据量8PB+v1表数量表数量1000+v2表数量表数量3000+ChangLog 数据入湖|ChangLog 数据入湖优点|近实时分析支持流式消费同步变更Schema 成本低ChangLog 入湖分区的选择-自增 Id 为主键|Bucket分
4、区分区数据均匀分布所有分区都可能需要 Compaction随着数据量增加,分区数不变Truncate分区分区数据只写入最近几个分区只对最近几个分区 Compaction随着数据量增加分区数递增ChangeLog 数据入湖产品化|日志数据入湖|隐式分区避免数据漂移问题隐式分区保证延迟数据正确分区Flink+Iceberg 事务性保证数据不丢不重支持 Schema 同步变更日志数据入湖产品化|Iceberg-governance 服务|Compaction服务服务 合并小文件、merge delete filesExpire Snapshots服务服务 过期 snapshotsOrphan Fil
5、es clean服务服务 清理孤儿文件Hive 升级 Iceberg|压缩方式压缩方式存储格式存储格式Parquet+ZSTD 存储节约存储节约UNCOMPRESSEDTEXT80%SNAPPYSequenceFile30%+SNAPPYParquet30%+GZIPParquet5%在 Compaction 中配置更高的 compression level 获得更高的压缩率Hive 升级 Iceberg 产品化|基于 Iceberg 的流批一体的探索03|Lambda 架构|实时链路提供时效性离线链路提供准确性离线数据支持回溯离线数据可供OLAP查询实时链路不支持OLAP 查询实时链路回溯能
6、力有限两套存储,存储成本高两套代码,开发维护成本高实时离线数据不一致数据湖架构|Iceberg 存储上统一 Flink 计算引擎统一 支持回溯 支持 OLAP 查询 支持构建变更流为什么需要离线作业来修数据?|Flink 状态过期导致没 Join 上Watermark 设置导致延迟数据丢失Lookup Join 完成后维表发生了变更Overwrite VS Merge Into?|MERGE INTO prod.db.target t -a target tableUSING(SELECT.)s -the source updatesON t.id=s.id AND t.date=202206
7、01-condition to find updates for target rowsWHEN MATCHED AND s.op=delete THEN DELETEWHEN MATCHED AND t.count IS NULL AND s.op=increment THEN UPDATE SET t.count=0WHEN MATCHED AND s.op=increment THEN UPDATE SET t.count=t.count+1wWHEN NOT MATCHEDTHEN INSERT*Overwrite VS Merge Into?|Overwrite 分区覆盖 语法简单
8、性能好 可能导致下游消费波动Merge Into 增量更新 语法复杂 性能不如 overwrite 下游只消费变更数据Merge Into 增量同步数据|Merge Into 更新 Iceberg,Flink 同步变更至下游不同的分区带来的问题|ProcessTime 分区 实时总是写入 T 分区 离线修正 T-1 分区(Overwrite)实时离线处理的数据无交集EventTime 分区 实时写入对应分区 离线修复历史全量(Merge Into)实时离线处理的数据存在交集Merge Into 的隔离级别带来的问题|Serializable isolation level 与提交过程中其他已成功提交事务冲突则本次提交失败 离线作业失败概率增加使用 Serializable isolation level,实时只处理 T 分区的变更,T-N分区变更由离线修正Snapshot isolation level 覆盖提交过程中其他已提交事务的更新 丢失中间事务的更新构建流批一体的链路|未来规划04|未来规划|Flink CDC2.0 跟进Compaction优化及治理Flink 1.14跟进非常感谢您的观看|