作者 | 吳剛 雲器科技 Lakehouse 技術專家
隨著 Data+AI 技術的快速演進疊代,湖倉一體架構(Lakehouse)已經成為當前數據平台的事實標準。本文將簡要概述數據平台的發展史,闡述湖倉架構產生的必然性。再從開放性的角度出發,探討 Lakehouse 架構的選型,以及為什麼開放式湖倉設計(Open Lakehouse)會是湖倉一體架構的最終歸宿。
湖倉一體的誕生
我們先來看下湖倉一體架構出現之前,數據平台經過了怎樣的發展。根據 CCSA TC601 大數據技術標準推進委員會發布的《湖倉一體技術與產業研究報告(2023 年)》顯示,數據平台架構持續演進主要經歷了資料庫、數據倉庫、數據湖三個階段,它們各自都有明顯的優缺點:
既然數據倉庫和數據湖有著非常明顯的優缺點(見上表),就短暫地誕生過一種「湖倉混合」架構(見下圖),企業將數據湖和數據倉庫結合起來,以充分發揮它們各自的優勢。例如,企業可以使用數據湖作為數據的原始存儲和數據探索的平台,而將數據倉庫用於數據集成、數據清洗和高性能的分析查詢。但是,"數據湖 + 數據倉庫"混合架構也有著明顯的缺點:
由於現有架構中的數據倉庫和數據湖有著各種各樣的問題,湖倉一體架構就應運而生了,接下來我們來看看什麼是湖倉一體。
湖倉一體是什麼
Databricks 公司在 CIDR 2021 發表論文首次正式提出了 Lakehouse 的概念 ,但實際上湖倉一體的概念並非由單一個體提出,而是隨著技術的發展和需求的變化逐漸形成的,下圖分別列舉了國外主流廠商對 Lakehouse 的理解。
與"湖 + 倉"混合架構簡單地把數據湖和數據倉庫進行簡單的堆積不同,湖倉一體架構(Lakehouse)是一種新興的數據架構,將數據湖和數據倉庫的特點融合在一起。它旨在解決傳統數據湖和數據倉庫各自的局限性,並提供更強大的數據管理和分析能力。湖倉一體架構的特點如下:
湖倉一體架構通過將數據湖和數據倉庫的優勢結合起來,提供了更靈活、可擴展和強大的數據管理和分析能力。它適用於各種數據場景,包括實時分析、機器學習、數據探索和報表等。
傳統數據倉庫和數據湖的老玩家,演進到湖倉一體架構有兩個主要方向:一是「湖上建倉」,即在數據湖的基礎上構建數據倉庫,保留數據湖的靈活性和可擴展性,同時引入數據倉庫的治理和分析能力,典型的例子是 Databricks 和開源 Hadoop 體系;二是「倉外掛湖」,即在數據倉庫外部掛載數據湖,讓數據湖成為數據倉庫的一個數據源,以便企業更好地利用數據湖中的數據,典型的例子是 Amazon Redshift、Google BigQuery、阿里雲 MaxCompute。由此可見,湖倉一體技術的發展,旨在融合數據湖和數據倉庫的優勢,形成一種更強大、靈活且易於管理的數據管理架構。通過湖倉一體,企業可以更好地處理和分析各種數據類型,實現數據價值的釋放,因此湖倉一體架構已經成為當代大數據平台的事實標準。
湖倉一體發展趨勢
隨著用戶場景和業務需求的不斷變化,湖倉一體架構在發展過程中也出現了新的趨勢。Dremio 在 2023 年發表的論文《The Data Lakehouse: Data Warehousing and More》中,提出 Lakehouse 是一個與具體實現無關的模塊化湖倉一體架構:
模塊化的湖倉一體架構,核心模塊包括以下幾個方面:
模塊化的設計讓湖倉一體架構更加清晰和可解釋,這個觀點與 Voltron Data(開源項目 Apache Arrow 背後的商業公司)提出的 Composable Codex 不謀而合。
Voltron Data 聯合 Meta 和 Databricks 發表在 VLDB 23 上的論文《The Composable Data Management System Manifesto》指出,不僅模塊化是數據系統的正確發展方向,基於開放標準和開源模塊構建的數據系統才是未來,可以帶來很多好處:
開放式湖倉才是未來
傳統數據倉庫對用戶最大的困擾是很容易被運營商鎖定(Vendor Lock-in),通常有以下幾個原因:
湖倉一體架構發展到今天,其最吸引人的一個特點就是就是數據開放性,這是因為其獨特的模塊化設計帶來的:
值得一提的是,有些廠商聲稱自己是「開放式」湖倉一體架構,但所謂的「開放」實際是存算分離架構的「開放」,其實是與開放式湖倉一體混為一談。存算分離是一種大數據處理架構,它將存儲和計算節點分開,數據節點負責數據的存儲和管理,而計算任務則由單獨的計算節點來負責執行。相對於傳統的存算一體架構,存算分離架構設計使得系統能夠擴展到更大規模的並發能力和數據容量。相較於湖倉一體架構的開放數據設計,存算一體架構只是把數據放在了存儲節點上,並沒有保證數據的開放性(如使用開源表格式 Apache Iceberg,或者開源文件格式 Apache Parquet 等),因此並不能認為存算分離架構也是開放的。
隨著人工智慧(AI)和大語言模型(LLM)的熱潮,AI 給數據平台帶來新的挑戰:AI 需要更豐富的數據,數據需要更多樣的 BI+AI 應用。Data 與 AI 的關係不再是 Data+AI,而是 Data*AI ——數據平台不再是一對一的計算和存儲架構,而是 m 對 n 關係的架構。這樣的架構改變變化下,數據平台的架構更應有兼具一體化與開放性的設計。開放式湖倉一體架構,是面向 Data+AI 融合場景的新趨勢。
雲器開放式湖倉的設計理念
我們(雲器科技)是一家新興的數據平台服務提供商,主打多雲及一體化的數據平台服務。我們依照 Open Lakehouse 的設計理念,實現了一套完整的系統,並服務多家頭部客戶。存儲層設計兼容各種主流的開放存儲格式,確保與廣泛的數據環境的無縫集成:
文章前半部分講述了 Open Lakehouse 的架構優勢、設計目標和原則。文章後半部分,重點介紹我們在實現過程中的設計、取捨和經驗總結。
雲器開放式湖倉的設計實踐
擁抱 Apache Iceberg 打造開放生態
Apache Iceberg、Apache Hudi 和 Delta Lake 是當前數據湖領域中的三種主要表格式,它們都在努力成為數據湖的標準表格式,這種競爭有時被形象地稱為"Table Format War"。這三種表格式都是開源的,擁有非常好的生態,背後都有一個商業公司在支持。雲器認為重複再造一個新的表格式的輪子並不能讓 Lakehouse 更加地開放,因此選擇一個最合適的表格式,圍繞它構建 Lakehouse 的內置表格式,打造一個開放的生態是對用戶最負責任的方案。
為什麼是 Apache Iceberg
來自 Tabular(Apache Iceberg 背後的商業公司)的 Brian Olsen 在 2023 年 7 月發表了一篇文章 Iceberg won the table format war,他認為 Apache Iceberg 已經在這場表格式的競爭中取得了勝利。其觀點基本符合我們的看法,也是雲器科技選擇使用 Apache Iceberg 作為開放存儲底座的原因:
如何基於 Apache Iceberg 構建通用的增量存儲
雲器 Lakehouse 使用 Apache Iceberg 表格式,以及 Apache Parquet 文件格式,打造了一個能夠實時兼容 Apache Iceberg 標準的存儲文件布局,其元數據通過完全兼容 Iceberg 的 catalog 進行輸出,天然兼容所有支持消費 Apache Iceberg 的開源框架,如 Apache Spark 和 Trino 等。由於所有雲器 Lakehouse 內表輸出的數據文件都是以 Apache Parquet 格式存放在雲對象存儲上,元數據完全兼容 Apache Iceberg,用戶真正擁有自己的數據資產,無需擔心 Lock-in 的風險。
前面提到過增量計算模式依賴增量存儲,這也是通過 Apache Iceberg 實現的。具體來說,基於 Snapshot Isolation 使用 Apache Iceberg V2 標準引入的 Position Delete File 來表示增量數據。由於 Position Delete File 只能表示數據的刪除,我們需要把 Update 拆分成經典的 Delete+Insert 模式,這樣的設計對數據有三個挑戰:
圍繞 Apache Parquet 錘鍊極致性能
對於 Lakehouse 的引擎來說,一個 SQL 查詢始於讀(TableScan)終於寫(TableSink)。如果說開放的表格式決定了 Lakehouse 的能力下限,那合適的文件格式則可以決定 Lakehouse 的性能上限。在大數據領域,Apache Parquet 和 Apache Orc 基本就是列存格式的實施標準。兩者曾一度各占半壁江山,但現在就像 DuckDB 作者 Hannes 回答社區問題時說的,似乎 Apache Orc 已經被用得越來越少了。那在 Apache Parquet 越來越獨領風騷的今天,是不是無腦選擇它就能高枕無憂了?
事實並非如此,Parquet 標準其實是一個基於 Thrift 協議定義的文件格式,其中包含很多可選的欄位,這為後面的問題埋下了伏筆:
儘管 Parquet 有各種各樣的問題,它仍然是當前大數據文件格式的事實標準,在開放存儲這個大前提下,也沒有什麼好糾結的。既然 Parquet 是開源的,是不是挑一個開源實現拿來用就好了?很多引擎和框架都實現了自己的 Parquet 讀寫模塊,但由於前面提到的問題,要麼功能不全,要麼性能不佳,基本沒有能直接拿來用。早在雲器 Lakehouse 選型文件格式的時候(2022 年初),C++ 的開源 Parquet 實現只有 Apache Arrow、Apache Impala 和 DuckDB 三家,其中後兩者都只實現了 V1 的功能;而 Apache Arrow 中的 Parquet C++ 代碼是 Parquet 社區捐贈的,V2 的功能也實現了一部分,但仍然缺少 Predicate Pushdown、Page Index 和 Bloom Filter 等重要功能,並且內部測評的性能也不及預期,無法直接使用。
Community Over Code
縱觀國外的一些友商,Velox 和 Databricks 開發了自己的 Native C++ Parquet 實現,而 Snowflake、BigQuery 和 ClickHouse 則都是基於 Apache Arrow 中的 Parquet C++ 實現來完成 Parquet 的拼圖。雖然從頭開發一套 Parquet 實現的確能夠獲得最佳的定製和性能,但也需要付出大量重複勞動,也可能會掉進一些前人踩過的坑。既然 Apache Parquet 是一個開源的標準,沒有任何秘密,而 Apache Arrow 已經被友商廣泛使用,那直接基於 Apache Arrow 中的 Parquet 代碼來實現雲器 Lakehouse 的文件格式,也符合雲器 Lakehouse 追求最佳開放性的設計理念。與此同時,雲器科技也決定投入到社區當中,補全 Parquet 缺失的功能,並且深度優化性能,從而真正成為社區的一部分。
主要貢獻
雲器科技對 Parquet 社區的貢獻,主要涉及了 Apache 軟體基金會旗下兩個頂級項目 Apache Parquet 和 Apache Arrow 的三個 GitHub 倉庫:
上面兩張圖基本涵蓋了雲器科技在 Parquet 社區中最主要的貢獻,團隊兩名成員也因此被 Apache Parquet 和 Apache Arrow 社區提名為 Committer。雲器科技對開源社區的投入不會停止,團隊成員在 2023 年 8 月北京舉行的「Apache Software Foundation 旗下大會 - Community Over Code Asia 2023」上分享了參與開源項目的心得,後續仍會深耕社區,把我們認為有價值的功能貢獻回社區,讓更多的用戶受益。
總 結
本文回顧和分析了數據湖倉的歷史和大數據平台的演進趨勢,提出了基於增量計算的一體化趨勢,以及該架構必然需要一個開放式的增量存儲支撐。基於 Single Engine · All Data 理念雲器發布了一體化數據平台——雲器 Lakehouse,並分享了如何圍繞 Apache Iceberg 和 Apache Parquet,來構建開放湖倉之上的增量存儲,獲得最佳開放性和極致性能。同時雲器科技也大力投入開源社區,以合作共贏的姿態踐行構建 Open Lakehouse 的設計理念。
作者簡介:
吳剛,雲器科技,Lakehouse 技術專家。目前是 Apache ORC 的 PMC,也是 Apache Arrow 和 Apache Parquet 的 committer。在此之前,曾是阿里巴巴的高級技術專家,負責 MaxCompute 的存儲系統,也曾在 Uber 負責 Apache Spark 平台。
選擇哪種程式語言已經不重要了,只提倡程式設計師下班後「多看看書」提升競爭力是誤人子弟|獨家專訪亞馬遜 CTO
一代更比一代強,AI 時代的至強如何為雲服務保駕護航?
尋找增長,SaaS 企業選擇上飛書
離開雲轉戰 AI?23 歲寫了百萬人用的開源軟體,這個 IT 奇才 11 年後離開了自己的上市公司