有道基于 Amoro Mixed Format 构建准实时湖仓实践
作者简介
谢怡,网易有道高级大数据开发工程师,目前主要参与实时计算和湖仓一体方向的研发
王涛,网易资深平台开发工程师,主要从事大数据和湖仓平台建设
业务背景
有道的数据层架构可分为离线和实时两部分,离线计算主要采用Hive、Spark,采用批处理的方式定时调度。实时部分采用 Flink+Doris(版本 0.14.0)构建实时数仓,用于处理实时埋点日志、业务库变更数据。ODS 层数据源为 Kafka 埋点日志、数据库业务数据,DWD、DWS层数据通过Flink计算引擎加工,写入 Doris 中。同时将 Doris 数据定时同步至 Hive,用于离线调度计算。该架构存在如下问题:
- 开发和运维成本高:Flink SQL 与 Hive/Spark 语法差异大,Hive/Spark 向 Flink 迁移成本高,Flink 大状态任务运维和优化难度高。
- 在全增量流式读取场景的支持性较弱,难以满足有道场景下 Flink 全量读取 Hive 历史数据及 Kafka 增量数据的需求。
- 流批存储不统一,造成双倍的数据开发和存储成本,且容易造成数据口径不一致。
- Doris 作为数据孤岛,采用 SSD 存储,成本较高,不适合大规模词典日志数据存储,长期两套存储方案不利于成本优化。
- 需要持续地在 Hive 和 Doris 之间导入导出数据,链路过长容易引入不稳定因素,比如大规模数据写入时,Doris 导出 Hive 偶发数据丢失,并且不支持储存长 String 类型的字符串。
结合上述问题,有道希望从 Hive 升级为湖仓一体方案,支持流批读写,统一数据存储。并基于 Spark/Trino/Hive ETL 搭建分钟/小时级近实时数仓,降低开发和运维成本,在绝大多数场景下替换 Doris 的分钟级数仓场景,减少数据库数据同步成本,有效降本增效。
引入 Amoro Mixed Hive
Amoro Mixed Hive 提供了Hive 读写兼容、数据自优化的能力,基于此提供了两种不同时效性读取的能力:
- Merge on read 可以达到分钟级数据新鲜度
- Hive 读可以达到小时级新鲜度 同时也实现了对 Hive 数据的更新和删除,下游老 Hive 任务无需作任何修改即可享受数据时效性提升到小时级,对于习惯使用 Hive 的分析师来讲可以做到无感,降低了新技术的使用门槛。
Hive 表格式兼容
Amoro 为了兼容 Hive 设计了 Mixed Hive,Mixed Hive 的存储结构如图, BaseStore 是一张独立的 iceberg 表,Hive 表作为 BaseStore 的一部分,ChangeStore 是一张独立的 iceberg 表, Mixed Hive 支持:
- schema、partition、types 与 Hive format 保持一致
- 使用 Hive connector 将 Mixed Hive 表当成 Hive 表来读写
- 可以将 Hive 表原地升级为 Mixed Hive 表,升级过程没有数据重写和迁移,秒级响应
- 具备湖仓一体的特性,包括基于主键 upsert,流式读写,ACID,time travel 等功能
Hive 读写兼容的特性实现 Hive 表向 Mixed Hive 的无缝迁移, 并且可以做到上下游无感知。
Hive 数据更新
Amoro 借助 Self-optimizing 将实时写入的变更合并到 Hive, 实现了 Hive 数据更新。Self-optimizing目标是基于新型数据湖表格式打造像数据库,传统数仓一样开箱即用的流式湖仓服务,Self-optimizing 包含但不限于文件合并,去重,排序。 Amoro 将表中的文件按照大小分为了两类:
- Fragment File:碎片文件,默认配置下小于 16 MB 的文件,此类文件需要及时得合并成更大的文件,以提升读取性能
- Segment File:默认配置下大于 16MB 的文件,此类文件已经具备一定的大小,但还不到理想的 128MB。
基于文件分类,Amoro 将文件优化任务分为三类:Minor optimizing、Major optimizing、Full optimizing,应对写友好、读友好的场景,在保证写入性能同时,保证读性能的平衡。特别地 Full optimizing 会将实时写入的数据定时合并到 Hive 目录,实现 Hive 数据视图的更新,提高 Hive 数据的时效性。 持续的 Self-optimizing 可以有效优化表内文件的大小分布,降低小文件数,减少 AP 查询的性能开销。
落地方案
数据链路改造
基于 Amoro,我们对于传统链路进行了以下改造:
- 开发方式上,贴源层的数据导入从 Flink SQL 方式改造成基于实时数据湖平台,业务通过简单的交互即可完成Hive 升级和入湖链路的构建。
- 通过数据传输定时同步数据库到 Hive 的链路,改造成实时 Mixed Hive format 表,数据时效性提升的同时,也提前了离线 workflow 基线,数据产出时间大大提前。
- Amoro 替换 Doirs,降低数据链路的复杂度,做到存储的流批统一,提高了稳定性。
- 数据查询端,通过直接查询 Mixed Hive format 表实现数据时效性的提升,数据报表时效性可以达到分钟级;原来查询 Hive 的报表链路时效性可以提升到小时级。
实时数据湖平台共建
为了屏蔽底层存储变更对于业务开发的学习成本, 网易杭研基于 Amoro 在内部提供了实时数据湖开发平台,封装了从 Hive 表升级到构建数据入湖全流程,帮助用户一站式完成开发和运维,降低用户的使用门槛和成本。
- Hive 表升级到 Mixed Hive 表,包含主键配置、分区键配置。
- 创建源端到 Mixed Hive 表的入湖任务, 支持数据库 cdc 入湖、日志入湖。
- 基于NDC(网易数据运河) 打通从源端数据库 binlog 直接输出到 Mixed Hive 表全增量入湖链路。
- 支持配置日志kakfa 到 Mixed Hive 表的实时入湖链路。