國產開源湖倉LakeSoul--數據智能的未來方向
一、LakeSoul 設計理念和技術原理解讀
首先和大家分享 LakeSoul 的設計理念。
1、LakeSoul 設計理念解析——背景
圖:LakeSoul 設計理念解析——背景
Modern Data Stack,簡稱 MDS,中文翻譯為現代數據棧,其特點之一就是數據上云,以云數據倉庫為核心。同時數倉采用計算和存儲分離的模式,計算資源可以彈性伸縮,滿足負載波峰波谷的變化,降低成本;存儲資源可以線性擴大,高可用,無容量限制。
- 湖倉:在數據湖基礎設施上構建數倉融合湖、倉各自的優勢,湖倉一體能發揮出數據湖的靈活性與生態豐富性,以及數據倉庫的成熟性與企業級能力,幫助企業建立數據資產、實現數據業務化、進而推進全線業務智能化,實現數據驅動下的企業數據智能創新,全面支撐企業未來大規模業務智能落地。
- ELT:由 ETL 向 ELT 轉變,實時自動化數據集成,增量式數據建模計算和查詢。
- 流批一體:流批統一計算鏈路、統一存儲,統一數據鏈路,支持并發寫、Upsert、ACID、快照讀等功能。
- 多元應用:BI/AI 一體化,多種計算模式、多種計算引擎直接讀取數據,統一數據架構和口徑。
2、LakeSoul設計理念解析——設計目標
圖:LakeSoul 設計理念解析——設計目標
LakeSoul 的設計目標包括四部分,湖倉一體、流批一體、端到端實時以及 BI/AI 一體。
- 湖倉一體:針對計算存儲分離優化設計,在湖上低成本構建大規模數倉。
- 流批一體:管理大規模的數據湖文件,支持高并發大批量的寫入、Upsert 更新,快照讀、回滾等機制。
- 端到端實時:提供多源自動實時數據入湖(CDC、Kafka),實時增量計算 Pipeline等功能,打造端到端簡單易用的實時數倉。
- BI/AI 一體:支持大數據、AI 模型訓練多種計算框架,使用湖倉統一數據口徑。
3、LakeSoul 設計理念解析——時間線
圖:LakeSoul 設計理念解析——時間線
LakeSoul 時間線起源于大型推薦和廣告業務實時數據流場景,分五個階段:
- 2021.12前:LakeSoul 國產自研流批一體湖倉框架開源。
- 2021.12至2022.07:重構元數據,提升并發更新和事務能力。
- 2022.07至2022.10:發布 Flink CDC 多表自動入湖,支持整庫同步,自動 DDL變更。
- 2022.10至2023.05:發布 Native IO,擴大性能領先優勢。LakeSoul 項目捐贈給 Linux 基金會孵化。
- 2023.05至2023.6:發布全鏈路流式增量計算,自動合并等領先功能通過國產信創認證。
4、LakeSoul 技術解析——整體架構
圖:LakeSoul 技術解析——整體架構
LakeSoul 的整體架構如上圖所示。包括三層,底層 LakeSoul Storage Layer 表示數據存儲層,中間 LakeSoul Query Engine 表示數據查詢引擎,最上層 LakeSoul Distributed Meta Service 表示分布式元數據服務,左面是數據源,右面是加載數據和數據服務。
- LakeSoul Storage Layer:數據存儲層,支持的存儲包括 Amazon S3、HDFS、MINIO、阿里云OSS 等,通過 Cloud Storage Driver、Hot Data cache 加載數據到數據存儲層。
- LakeSoul Query Engine:支持多種計算引擎包括 Spark、Flink、Hive 等,讀取存儲層數據進行加工、分析、建模等。
- LakeSoul Distributed Meta Service:分布式元數據服務,包括元數據管理-Schema Manage、數據事務管理-ACID Control、數據分布/狀態-Data Distrbution/Stats 等功能。
- 數據源:包括流數據-Streaming Data 和批數據-Batch Data。
- 數據服務:數據服務包括BI和AI兩塊,支持AI使用結構化和非結構化數據。
5、LakeSoul 技術解析——數據格式
圖:LakeSoul 技術解析——數據格式
下面看一下 LakeSoul 的數據格式。
- 表物理數據組織:使用 Parquet 格式存儲;按主鍵哈希分片,單個文件內按主鍵排序;支持多級 Range 分區。
- 表元數據組織:支持表、分區、文件多級管理。每次提交會產生一個新的版本 Version,每次提交版本號會遞增。
6、LakeSoul 技術解析——元數據(元數據管理)
圖:LakeSoul 技術解析——元數據(元數據管理)
元數據,主要包括分區信息表 Partition_info、數據提交信息表 Data_commit_info、表信息表 Table_info、表名 ID 信息表 Table_name_id 和表路徑 ID 信息表 Table_path_id 等。
中心化的元數據管理包括以下內容:
- 使用 PostgreSQL 作為存儲:PostgreSQL 是開源的對象-關系數據庫數據庫管理系統,支持豐富的數據類型(如 JSON 和 JSONB 類型、數組類型)和自定義類型。
- 使用 PG 事務實現并發控制、ACID 等能力
- 使用 PG 兩階段提交協議用于數據并發讀寫時沖突檢測
- 使用 PG Trigger 機制實現事件訂閱,用于觸發自動 Compaction 等
7、LakeSoul 技術解析——元數據(兩階段提交協議)
圖:LakeSoul 技術解析——元數據(兩階段提交協議)
元數據的兩階段提交協議,在 Spark/Flink 流/批作業寫數據時執行,發生沖突時會進行重試或者失敗等。
8、LakeSoul 技術解析——元數據(自動并發沖突解決機制)
圖:LakeSoul 技術解析——元數據(自動并發沖突解決機制)
細分作業寫入時數據提交類型,不同類型之間沖突時會采取如下幾種措施:
- 直接重試提交:兼容的寫沖突(Append、Merge)
- 重新排列 Commit:Compaction、Update 的部分情況
- 不兼容沖突:并發全量 Update 等,提交失敗
9、LakeSoul 技術解析——元數據(自動演進和快照管理)
圖:LakeSoul 技術解析——元數據(自動演進和快照管理)
LakeSoul 還提供了 Schema 自動演進和快照管理的能力。
Schema 自動演進:
- 在寫時自動處理 Schema 變更。
- 允許并發進行變更,不需要停作業再執行 DDL。
- 讀數據自動兼容,讀數據自動兼容包括新增加列:舊數據自動補充 null;刪除列:舊數據自動過濾該列;提升類型精度:舊數據自動執行 Upcast。
元數據快照管理:
- 快照讀、快照回滾、快照清理
- 默認讀取最新的快照
10、LakeSoul 技術解析——Native IO(設計理念和設計原理)
圖:LakeSoul 技術解析——Native IO(設計理念和設計原理)
Native IO 的設計主要考慮了以下方面:
- Upsert、MOR 讀寫的封裝:包括屏蔽讀寫實現細節,與計算引擎無關 ;向上提供簡潔的 Writer、Reader 接口。
- 多引擎對接:包括方便對接各類 SQL、AI 引擎;支持向量化計算引擎;C、Java、Python 多語言支持。
- 高性能:包括針對對象存儲讀寫優化;嚴格的內存占用控制。
- 實現原理如下:
- 基于 Rust、Apache Arrow-rs 和 DataFusion 實現異步 Writer、Reader:包括使用 Parquet 作為存儲格式;Writer:主鍵排序(支持磁盤 spill)、異步并發Multipart upload;Reader:異步 Parquet RowGroup Prefetch、MOR 主鍵有序歸并。
- 封裝 C Interface。
- 通過 jnr-ffi/ctypes 進一步封裝 Java、Python 接口。
11、LakeSoul 技術解析——Native IO(性能對比)
圖:LakeSoul 技術解析——Native IO(性能對比)
上圖是 Spark 讀寫 AWS S3的性能對比。可以看到:
- Spark 讀 AWS S3 讀性能 Parquet Scan 對比:Native IO 遠高于 Parquet-mr。
- Spark 讀 AWS S3 寫性能 Parquet Write 對比:Native IO 高于 Parquet-mr。
測試報告鏈接https://github.com/meta-soul/LakeSoul/tree/main/lakesoul-spark/src/test/scala/org/apache/spark/sql/lakesoul/benchmark/io
二、LakeSoul 核心功能和優勢
接下來介紹 LakeSoul 的核心功能和優勢。
1、LakeSoul 核心功能——入湖
圖:LakeSoul 核心功能——入湖
首先要介紹的核心功能是入湖。LakeSoul 流批一體表存儲系統由 Spark 湖倉表、Flink 湖倉表、Schema 自動演進、計算與存儲彈性擴容、并發寫入更新等功能模塊組成。其中 Spark湖倉表模塊實現了使用 Spark SQL 語句創建湖倉表、向表中插入數據、更新表中已有數據、讀取湖倉中的表、讀取表的歷史快照、回滾到表的歷史版本等功能;Flink湖倉表模塊實現了使用 Flink SQL 語句創建湖倉表、向表中插入數據、批量讀取湖倉表、流式全量讀取湖倉表、流式增量讀取湖倉表等功能;Schema 自動演進模塊實現了 Schema 變更時自動兼容讀取表的舊數據等功能;被測系統支持計算與存儲能力的彈性擴容;支持對同一個表的同一個分區進行并發寫入更新。
多源數據實時入湖包括以下能力:
- 數據庫多表實時入湖、Kafka 多 topic 實時入湖。
- 支持 Flink CDC、Debezium 等多種 CDC 采集工具。
- 自動發現新表、自動 DDL 變更。
- 精確一次(Exactly Once):消息不會丟失,也不會被重復發送。
2、LakeSoul 核心功能——增量計算
圖:LakeSoul 核心功能——增量計算
第二個核心功能是增量計算,LakeSoul 表在 CDC 讀寫時具有以下特性:
- 讀寫均兼容 Flink Changelog Stream。
- 增量讀取 CDC 流。
- 全量讀取合并后數據。
3、 LakeSoul 核心功能——多流拼接
圖:LakeSoul 核心功能——多流拼接
第三個是多流拼接,原生支持多流并發寫入拼接。
- 多個流可以是異構的,只要有相同主鍵列即可。
- 其余列可以不同。
- 消除 Join 計算,降低延遲,減少資源消耗。
4、LakeSoul 核心功能——權限和血緣
圖:LakeSoul 核心功能——權限和血緣
第四是權限和血緣方面的功能。權限方面,實現了通用的 RBAC 的權限控制功能,用到了 PG 數據庫本身的 RBAC 和行級別安全策略的功能。為了實現細粒度的表級別的權限控制,還用到了 Casbin。綜合這些功能點,實現了較為完善的權限控制,并且對各引擎都是統一的。
數據血緣功能,采用了開源的 OpenLineage 協議來上報血緣關系。
5、LakeSoul 核心功能——自動維護
圖:LakeSoul 核心功能——自動維護
第五是自動維護功能。自動維護包括自動全局 Compaction 服務,以及自動清理過期數據服務。
使用 PostgreSQL 的 Trigger 功能實現了如下功能:
- 達到 Compaction /清理條件時觸發事件。
- 使用 Spark 作業監聽事件并執行 Compaction /清理操作。
- Spark 作業可以彈性伸縮。
6、LakeSoul 核心功能——性能評測
圖:LakeSoul 性能評測
上圖中展示了性能評測的一些數據,分別以 Hudi、Iceberg、LakeSoul 三種產品進行寫 Write、讀 Read 測試。測試時提供兩種類型的表:寫時復制(Copy on Write,COW)表和讀時合并(Merge On Read,MOR)表,對于 Copy-On-Write Table,用戶的 update 會重寫數據所在的文件,所以是一個寫放大很高,但是讀放大為 0,適合寫少讀多的場景。對于 Merge-On-Read Table,整體的結構有點像 LSM-Tree,用戶的寫入先寫入到 delta data 中,這部分數據使用行存,這部分 delta data 可以手動 merge 到存量文件中,整理為 parquet 的列存結構。
測試代碼和數據如下:
- https://github.com/meta-soul/ccf-bdci2022-datalake-contest-examples/tree/mor。
- https://github.com/meta-soul/ccf-bdci2022-datalake-contest-examples/tree/cow。
測試方式如下:
- 第一批插入1000萬行數據。
- 分10次插入100萬行數據
- MOR讀取時沒有執行過Compaction。
測試結論為:
S3云對象存儲數據讀取:讀取 1000 萬行數據,執行三次,平均讀取時間 17.770秒,讀性能相比 Spark 3.3.2 提升 1.722 倍;
S3 云對象存儲數據寫入:寫入 1000 萬行數據,執行三次,平均寫入時間 43.194 秒,寫性能相比 Spark 3.3.2 提升 1.800倍;
Merge on Read 場景下數據讀取:讀取 2000 萬行數據,執行三次,平均讀取時間 25.811 秒,讀性能相比 Iceberg 1.1.0提升 1.420倍,相比 Hudi 0.12.2 提升 2.541倍;
Merge on Read 場景下數據寫入:寫入 2000 萬行數據,執行三次,平均寫入時間 266.628 秒,寫性能相比 Iceberg 1.1.0提升 5.832 倍,相比 Hudi 0.12.2 提升 12.209 倍。
三、LakeSoul 應用場景和案例
接下來分享 LakeSoul 的一些應用場景和案例。
1、LakeSoul 應用場景——構建實時湖倉
圖:LakeSoul 應用場景——構建實時湖倉
構建完整的實時湖倉一體鏈路包括:
- 多源數據實時入湖
- 全量、增量一體化分析
- 實時增量計算
- BI、AI 多種上層應用
2、LakeSoul 應用場景——實時機器學習
圖:LakeSoul 應用場景——實時機器學習
構建實時機器學習樣本包括:
- 使用 LakeSoul 多流拼接功能
- 將多個特征流、標簽流實時拼接
- 將樣本流式傳入機器學習訓練,實現在線學習
四、LakeSoul 開源社區進展和未來規劃
最后介紹一下 LakeSoul 開源社區進展和未來規劃。
1、LakeSoul 開源社區
圖:LakeSoul 開源社區
LakeSoul 于2021年底開源,采用 Apache License 2.0協議,成為國內首個開源湖倉框架。2023年5月將項目捐贈給 Linux 基金會,在 Linux Foundation AI & Data 基金會技術委員會答辯會議上,我們介紹了 LakeSoul 開源項目,得到了在場技術委員們的一致高度評價,成功通過投票,正式成為 Linux 基金會的孵化項目。成為 Linux Foundation AI & Data 旗下 Sandbox 項目。
未來 LakeSoul 項目將在 Linux 基金會的指引下,秉承開源、開放、協作的理念,全面建設發展 LakeSoul 開源社區。數元靈公司也將一如既往地全力支持 LakeSoul 開源項目和社區,持續貢獻核心功能和特性。在這里,我們也真誠邀請廣大開發者和用戶參與到社區中來,共同打造新一代湖倉一體開源框架。
https://github.com/lakesoul-io/LakeSoul。
2、LakeSoul 未來演進方向
圖:LakeSoul 未來演進方向
隨著 LakeSoul 新版本的發布,進入 Linux 基金會孵化和通過國產信創認證,LakeSoul 項目的發展揭開了新的篇章。LakeSoul 近期還將陸續推出一系列更新:在功能方面,將會增加內置角色權限控制、數據質量校驗等功能點,進一步完善數倉能力;在生態方面,將會推出原生 Python 讀取接口并與多種 AI 框架對接,成為 AI 大模型的新一代數據底座。
未來 LakeSoul 將繼續圍繞功能、生態和性能這三方面進行迭代。
功能方面:
- 數據質量規則自動化校驗
- 原生 Python Reader
- Hadoop/K8s 自動化部署
生態方面:
- 支持更多數據庫入湖
- Kafka Connect Sink
- LogStash Sink
- Presto Connector
性能方面:
- 提升 MOR 性能
- Minor compaction
- 支持引擎向量化計算
- 本地緩存