在上期的两篇连载文章中,我们分析了Lambda 和 Kappa 架构固有的一些问题,同时也引出了流批一体架构的优势,本文就 FastData流批一体大数据平台DLink ,如何基于 Flink + Iceberg 流批一体技术及其实践进行初步探讨。
二、需求背景
传统的基于离线(比如 Hive)数仓有很高的成熟度和稳定性,但在一些时延要求比较高的场景,则需要借助实时数仓 Flink 的帮助,将延时降低到秒级(或分钟级),但两套并存的数仓架构,势必带来双倍的资源消耗和开发维护工作量。那么,是否存在可以将离线和实时任务、批处理和流式任务,统一放在一套架构中调度和运行的架构呢?答案自然是肯定的。这就是 Dlink 的统一技术栈。
三、DLink 流批一体技术架构
(1)统一技术栈
DLink整体技术方案的核心理念就是“统一”。从底层Data Stack 的角度看,包括5 个部分:
关于 DLink的技术特点,在第四节会重点介绍一下。
实时数仓建设最重要的环节就是 ETL 任务,接下来我们结合实际场景和需求,看一下 Dlink 实时数仓是如何解决传统 Lambda架构在 ETL 场景中遇到的各种问题。
(2)实时数仓 ETL 场景
下图是DLink 流批一体数据平台在实时数仓场景(典型的 ETL 场景)的一个数据流图:
图二:DLink 数据流图
2.1 客户需求
客户之前完全使用 Oracle 搭建他们的数仓系统,在数据量达到一定规模之后,ETL 和数据分析的效率越来越低,亟需进行架构升级。对此,客户提出以下需求:一,实时抽取和写入:实时将 Oracle 的增量数据抽取并写入 Iceberg 中,业务数据的并发量在3000 行 / 秒,端到端时延要求在1至5分钟内;二,OLAP 统计分析:支持 DM 层数据的查询分析。
总之,对数据处理的实时性和数据的分析提出了要求。
2.2 实时数仓数据流程
结合客户的具体需求和 Dlink 的产品特性,我们设计了图二的流批一体实时数仓架构,从数据生命周期的角度,数据流程可以分为以下三个部分:
数据采集消费(Extract & Transform)
FastData DCT组件(类似 Debezium)负责 Oracle binlog 的抓取并转换成 dct-json 格式存储在 Kafka,实现增量数据入到 Iceberg 实时数仓。
数据统一存储(Unified Storage)
统一采用 iceberg 表格式存储全量数据,包括数仓的 ODS、DWD、DWS 和 DM 层数据,并实现各层之间增量数据的流转和处理。
数据实时处理(Transform & Load)
Flink 实际上在实时数仓 ETL 的以下阶段发挥了作用:
接下来,我们从数据的采集、转换、存储和分析的角度继续来看:FastData DLink 流批一体大数据平台集成了从数据采集到最终的数据计算、分析能力。结合图二来看,具体涉及的流程如下:
数据采集
采集流程中使用了FastData DCT 以及 Kafka 组件,实现了Oracle增量数据的实时采集。
数据转换
转换环节主要涉及数仓离线链路的处理。类似往期文章中提到的 Lambda 架构,我们实际上可以通过 Flink 批处理读取某个 Iceberg 表的快照做全局分析,得到的结果可供不同场景(如Ad Hoc查询、数据科学、机器学习)下的用户读取和分析。
数据存储
Iceberg 作为通用的表格式存储,很好地分离了计算引擎(Flink、Spark、Hive、Presto等) 和底下的存储层,这样就可以很好地兼容多种计算引擎和文件格式(Parquet、ORC、Avro 等),正在成为数据湖上Table Format 层的事实标准。
Iceberg manifest和snapshot的设计,有效地隔离了不同transaction的变更,非常方便批处理和增量计算。
同时,Apache Iceberg 的社区资源也非常丰富,Netflix、Apple、LinkedIn、Adobe等公司都有PB级别的生产数据,运行在Apache Iceberg之上。
数据分析
由于底层 Iceberg 存储格式的打通,Trino 可实时读取 Flink 写入的 Iceberg 快照,从而实现了端到端近实时(1 分钟之内)的分析。
四、DLink技术亮点
那么,为了支撑以上产品特性,DLink 平台中又引入了哪些创新的技术呢?
在构建 DLink 流批一体大数据平台的过程中,基于 Iceberg、Flink 和 Trino 技术栈,结合客户的实际场景和需求,我们在元数据管理、数据存储格式和数据分析性能上做了一些工作,总结如下:
(1)统一元数据存储(Catalog Manager)
基于 DLink 统一的 Catalog Manager (简称 CM)和 统一元数据模型,实现了 Flink 和 Trino 引擎在catalog、database、表、视图(包括物化视图)和数据类型的统一和 良好的互操作性,彻底解决大数据引擎元数据格式不同造成的各种问题,用户无需代码开发,真正实现 Define Once,Query Anywhere!
同时,DLink CM可对外提供标准的 Hive Meta Store 接口。通过 HMS 接口,我们也计划将 DLink 的内部托管数据源暴露给外部第三方数据引擎(Hive、Spark 等),实现 DLink与大数据生态的打通。
对于数据源和 Catalog 的管理,有三种情况:
(2)统一数据存储(Iceberg)
Apache Iceberg 作为一个开放的数据湖表格存储,接口定义清晰,支持Flink、Spark等各种大数据引擎,兼容性比较好。虽然有不少优点,社区也比较活跃,但目前还存在点查、更新性能差的问题,DLink 目前联合Iceberg社区在索引和维表等技术之上做了增强和优化:
Clustering 技术
通过z-order实现多维数据重新聚合排序,提升多维聚合性能,大幅提升查询性能。
二级索引
增加了 Bloom Filter 索引,文件级别的过滤性能大大提升,从而加速点查性能。
MOR(Merge On Read)优化
通过后台自动调度的 Job,合并delete file 和 data file。避免在读取时,查询完data file后,还需要临时合并 delete file 的结果,从而提升了读性能。
小文件合并
类似 MOR Job 的后台任务。基于 Iceberg 的快照隔离和读写分离的优秀特性,我们开发了小文件自动合并功能。后台 Job 自动合并小文件,持续优化读取性能。基于多版本的快照隔离能力,文件合并操作不阻塞用户正常读写。
Lookup Table
维度表在流式计算的应用很广,通过 SQL 的 join 操作实现数据的补全。比如, source stream 是MySQL Binlog 日志中的订单信息,但日志中仅记录了商品的 ID,这样当订单信息入仓,我们进行日志流 Join 的时候,就可以通过查询维表的方式,补全商品名称的信息。
DLink Lookup Table 将热数据高效缓存在本地,冷数据存储在 Iceberg,同时基于数据局部性原理和统计分析,我们加入了自研的缓存替换算法,缓存命中率较高。同时,查询维表时,通过 Projection 与 Filter push down 极大降低缓存的数据量,进一步提高了缓存的命中率。我们初步测试 Streaming Join 维表性能较 Flink 原生 Lookup Table 性能提升2倍以上。
(3)统一 SQL引擎
在统一元数据之后,为了进一步提升易用性,我们在 Trino 和 Flink 之上构建了统一的 ANSI SQL 层,提供了一致的使用体验。数据入湖,DML、DDL等 SQL 操作均由一套 SQL 实现。在统一的 SQL 引擎及其优化器之上,我们做了如下优化:
Dynamic Filtering技术
Dynamic Filtering 技术早在 2005 年就在 Oracle中实现。借鉴数据库的思路,我们基于 Trino 引擎在Iceberg connector 上实现了 Dynamic Filtering 技术,大大减少了 tableScan 算子扫描的数据量。对于Dynamic filtering 技术感兴趣的同学可以参考:Dynamic filtering 。
五、未来展望
在FastData DLink统一元数据与存储的架构之上,FastData DLink将继续优化流式计算和数据入湖的性能,优化端到端时延,秉承简单、高效、易用的理念,构建流批一体、湖仓一体的实时大数据平台。
2022 年,DLink 将在 Flink、Iceberg、Trino 等开源组件上的优化和新特性逐步回馈开源社区,与国内外同行共建良好的大数据生态。
由于本文篇幅的限制,对于DLink大数据流批一体处理、流式计算、多维分析和湖仓一体等,大家关心的下一代大数据平台核心技术,后续我们会持续和大家分享,敬请期待!