干货|字节跳动数据湖技术选型的思考
DataLeap
在2018年,我们基于Flink构造了异构数据源之间批式同步通道,主要用于将在线数据库导入到离线数仓,和不同数据源之间的批式传输。
在2020年,我们基于Flink构造了MQ-Hive的实时数据集成通道,主要用于将消息队列中的数据实时写入到Hive和HDFS,在计算引擎上做到了流批统一。
到了2021年,我们基于Flink构造了实时数据湖集成通道,从而完成了湖仓一体的数据集成系统的构建。
字节跳动数据集成系统目前支持了几十条不同的数据传输管道,涵盖了线上数据库,例如Mysql Oracle和MangoDB;消息队列,例如Kafka RocketMQ;大数据生态系统的各种组件,例如HDFS、HIVE和ClickHouse。
在字节跳动内部,数据集成系统服务了几乎所有的业务线,包括抖音、今日头条等大家耳熟能详的应用。
批式集成模式基于Flink Batch模式打造,将数据以批的形式在不同系统中传输,目前支持了20多种不同数据源类型。
流式集成模式主要是从MQ将数据导入到Hive和HDFS,任务的稳定性和实时性都受到了用户广泛的认可。
增量模式即CDC模式,用于支持通过数据库变更日志Binlog,将数据变更同步到外部组件的数据库。 这种模式目前支持5种数据源,虽然数据源不多,但是任务数量非常庞大,其中包含了很多核心链路,例如各个业务线的计费、结算等,对数据准确性要求非常高。 在CDC链路的整体链路比较长。首先,首次导入为批式导入,我们通过Flink Batch模式直连Mysql库拉取全量数据写入到Hive,增量Binlog数据通过流式任务导入到HDFS。 由于Hive不支持更新操作,我们依旧使用了一条基于Spark的批处理链路,通过T-1增量合并的方式,将前一天的Hive表和新增的Binlog进行合并从而产出当天的Hive表。
首先,这条基于Spark的离线链路资源消耗严重,每次产出新数据都会涉及到一次全量数据Shuffle以及一份全量数据落盘,中间所消耗的储存以及计算资源都比较严重。
同时,随着字节跳动业务的快速发展,近实时分析的需求也越来越多。
最后,整条链路流程太长,涉及到Spark和Flink两个计算引擎,以及3个不同的任务类型,用户使用成本和学习成本都比较高,并且带来了不小的运维成本。
为了解决这些问题,我们希望对增量模式做一次彻底的架构升级,将增量模式合并到流式集成中,从而可以摆脱对Spark的依赖,在计算引擎层面做到统一。
改造完成后,基于Flink的数据集成引擎就能同时支持批式、流式和增量模式,几乎可以覆盖所有的数据集成场景。
同时,在增量模式上,提供和流式通道相当的数据延迟,赋予用户近实时分析能力。在达到这些目标的同时,还可以进一步降低计算成本、提高效率。
经过一番探索,我们关注到了正在兴起的数据湖技术。
DataLeap
Iceberg:核心抽象对接新的计算引擎的成本比较低,并且提供先进的查询优化功能和完全的schema变更。 Hudi:更注重于高效率的Upsert和近实时更新,提供了Merge On Read文件格式,以及便于搭建增量ETL管道的增量查询功能。
哪个框架可以更好的支持我们CDC数据处理的核心诉求? 哪个框架可以更快速补齐另一个框架的功能,从而成长为一个通用并且成熟的数据湖框架?
01 - 索引系统
日志数据去重场景
CDC场景
02 - Merge On Read表格式
写入引擎更倾向于写小文件,以行存的数据格式写入,尽可能避免在写入过程中有过多的计算包袱,最好是来一条写一条。
查询引擎则更倾向于读大文件,以列存的文件格式储存数据,比如说parquet和orc,数据以某种规则严格分布,比如根据某个常用字段进行排序,从而做到可以在查询的时候,跳过扫描无用的数据,来减少计算开销。
写入引擎可以低延迟的将更新的数据写入到log文件中。 查询引擎在读的时候将log文件与base文件进行合并,从而可以读到最新的视图;compaction任务定时触发合并base文件和log文件,避免log文件持续膨胀。在这个机制下,Merge On Read文件格式做到了实时写入和近实时查询。
03 - 增量计算
DataLeap
同时数据湖集成技术也已经通过火山引擎大数据研发治理套件DataLeap对外开放。
产品介绍
火山引擎大数据研发治理套件DataLeap
一站式数据中台套件,帮助用户快速完成数据集成、开发、运维、治理、资产、安全等全套数据中台建设,帮助数据团队有效的降低工作成本和数据维护成本、挖掘数据价值、为企业决策提供数据支撑。后台回复数字“2”了解产品
- End -