LakeSoul's NativeIO 层实现原理介绍
· 阅读需 1 分钟
近期,湖仓框架 LakeSoul 发布了 2.3.0 版本。本次新版本发布是 LakeSoul 进入 Linux 基金会孵化后的第一次版本发布。本次新版本新增 Flink SQL/Table API,支持流、批的读写 。重构了多表实时入湖的 Flink DataStream API,以更好地支持多种数据源的实时入湖。新增了全局自动小文件合并服务。
LakeSoul 在 2.3.0 版本中,全面支持了 Flink SQL/Table API,同时支持流、批两种方式,对 LakeSoul 表进行读或写。在流式的读取或写入时,LakeSoul 完整地支持了 Flink Changelog Stream 语义。
在流式写入时,可以对接多种 CDC 采集工具,包括 Debezium、 Flink CDC Connector,支持行级别 upsert、delete;在读取时,对于 Append 或 Upsert 方式增量更新的表,均可流式增量读取,并在 Flink 中进行增量计算。同时,LakeSoul 也支持 Flink 批计算模式,能够支持批量 upsert、全量读取、快照读取等功能。
使用 LakeSoul + Flink SQL,可以很方便地在数据湖上构建大规模、低成本、高性能的实时数仓。具体使用方法可以参考 Flink SQL 文档。
LakeSoul 从 2.1 版本起能够支持数据库整库同步,并提供了 MySQL 整库自动同步工具。
在本次 2.3 版本更新中,我们重构了整库同步时的 DDL 解析方式。具体来说,LakeSoul 在进行整库同步时不再需要上游提供 DDL 事件,或去上游数据库获取表的 Schema 等信息,而是直接从同步的数据中解析是否出现新表、是否已有表的 Schema 发生了变更。遇到新表或 Schema 变更时,会自动在 LakeSoul 湖仓中执行建表或 Schema 变更。
这个改动使得 LakeSoul 可以支持任意类型的数据源入湖,例如 MySQL、Oracle 的 CDC 采集,或者从 Kafka 中消费 CDC 事件。开发者只需要将 CDC 消息解析为 BinarySourceRecord 对象,并创建 DataStream<BinarySourceRecord>
,即可实现整库同步。LakeSoul 已经实现了从 Debezium DML 消息格式到 BinarySourceRecord
对象的转换,其他 CDC 格式可以参考实现。
LakeSoul 支持流式、并发的 Upsert 或 Append 操作,每次 Upsert/Append 都会写入一批文件,在读取时自动进行合并(Merge on Read)。
LakeSoul 的 MOR 性能已经相对高效(参考之前的性能对比),实测在 Upsert 100 次后的 MOR 性能下降幅度约 15%。不过为了能够有更高的读性能,LakeSoul 也提供了小文件合并(Compaction)的功能。Compaction 功能是一个 Spark 的 API,需要对每个表独立调用,使用起来较为繁琐。
本次 2.3 版本更新,LakeSoul 提供了全局自动小文件合并服务。这个服务实际是一个 Spark 作业,通过监听 LakeSoul PG 元数据库的写入事件,自动触发对符合条件的表的合并操作。这个合并服务有如下几个优点:
LakeSoul 2.3 版本更新,能够更好地支持构建大规模实时湖仓,提供了高性能 IO、全链路流式计算、方便快捷的多源入湖等核心功能,全局合并服务在提升性能的同时保持了简单易用的特性,降低了数据湖的维护成本。
在下个版本,LakeSoul 还将原生支持 RBAC 权限控制、原生 Python 读取等功能。LakeSoul 目前是 Linux Foundation AI&Data 的 Sandbox 孵化项目,也欢迎广大开发者和用户参与到社区中来,一起打造更快、更好用的湖仓一体框架。
近日,经过数月研发,开源湖仓框架 LakeSoul 发布了 2.2.0 版本(Github 发布日志),这个版本最重要的升级是在 Spark、Flink 中默认启用了全新的 Native IO,性能再次获得显著提升,扩大了 LakeSoul 在云原生湖仓框架领域的性能领先优势。本文为您详细解读 LakeSoul 2.2.0 版本的更新以及 Native IO 的技术细节。
在 2.2.0 版本中,LakeSoul 实现了全新的 Native IO,将全量、增量的读写逻辑都迁移到了新的 IO 层实现,并做了大量性能和正确性测试,在 Spark 和 Flink 中都默认启用了新 IO 层。
2.2.0 版本还发布了 Spark 中的快照读取、回滚和清理、增量批式读取、增量流式读取等多个新接口,从而更为完善地支持高性能的流式增量的 ETL 数据建模流程。以下我们详细讲解这几个新的改进和功能点。