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