隨著大數(shù)據(jù)存儲(chǔ)和處理需求越來越多樣化,如何構(gòu)建一個(gè)統(tǒng)一的數(shù)據(jù)湖存儲(chǔ),并在其上進(jìn)行多種形式的數(shù)據(jù)分析,成了企業(yè)構(gòu)建大數(shù)據(jù)生態(tài)的一個(gè)重要方向。如何快速、一致、原子性地在數(shù)據(jù)湖存儲(chǔ)上構(gòu)建起 Data Pipeline,成了亟待解決的問題。為此,Uber 開源了 Apache Hudi,Databricks 提出了 Delta Lake,而 Netflix 則發(fā)起了 Apache Iceberg 項(xiàng)目,一時(shí)間這種具備 ACID 能力的表格式中間件成為了大數(shù)據(jù)、數(shù)據(jù)湖領(lǐng)域炙手可熱的方向。
雖然現(xiàn)階段國內(nèi)仍然缺乏數(shù)據(jù)湖概念上的優(yōu)秀商業(yè)方案,但在基礎(chǔ)軟件開源化的趨勢下,國內(nèi)企業(yè)在數(shù)據(jù)湖技術(shù)點(diǎn)上的探索與跟進(jìn)并不比國外企業(yè)落后太多。騰訊在 2018 年加入大數(shù)據(jù)存儲(chǔ)開源項(xiàng)目 Apache Ozone,后又于 2019 年開始投入研發(fā) Apache Iceberg;阿里巴巴也正聯(lián)合 Apache Iceberg 社區(qū)積極推動(dòng) Flink 實(shí)時(shí)數(shù)據(jù)湖技術(shù)方案的落地。那么,Iceberg 和其他兩個(gè)開源項(xiàng)目有何不同?為什么阿里和騰訊都在積極投入 Iceberg 的開源生態(tài)?Iceberg 有什么獨(dú)到之處?
近期 InfoQ 采訪了騰訊數(shù)據(jù)平臺(tái)部數(shù)據(jù)湖內(nèi)核技術(shù)負(fù)責(zé)人、資深大數(shù)據(jù)工程師邵賽賽,他與我們分享了騰訊選擇 Iceberg 前后的一些思考和采用 Iceberg 之后所做的優(yōu)化工作,本文基于采訪整理而成。邵賽賽還將在 QCon 全球軟件開發(fā)大會(huì)(北京站)2020 帶來主題為 《Iceberg - 新一代的數(shù)據(jù)湖表格式》 的演講分享,感興趣的讀者可以關(guān)注。
計(jì)算引擎之下、存儲(chǔ)之上的新技術(shù)
數(shù)據(jù)庫大牛、圖靈獎(jiǎng)獲得者 Michael Stonebraker 曾在 MapReduce 誕生之初撰寫過一篇文章,題為 “MapReduce: A major step backwards”,Michael Stonebraker 在文章中直截了當(dāng)?shù)刂赋觯篗apReduce 忽視了數(shù)據(jù)庫領(lǐng)域積累超過 40 年的技術(shù)經(jīng)驗(yàn)。雖然大數(shù)據(jù)技術(shù)的出現(xiàn)和迭代降低了用戶處理海量數(shù)據(jù)的門檻,但另一方面,與數(shù)據(jù)庫這樣高度優(yōu)化的技術(shù)相比,大數(shù)據(jù)技術(shù)的抽象和實(shí)現(xiàn)還是太原始和初級(jí)。因此大數(shù)據(jù)技術(shù)在后續(xù)十幾年的發(fā)展中,一直以數(shù)據(jù)庫為目標(biāo),將更多數(shù)據(jù)庫的成熟技術(shù)和理念借鑒到大數(shù)據(jù)中。
當(dāng)前,大數(shù)據(jù)分析領(lǐng)域已經(jīng)相當(dāng)成熟,如何借鑒更多數(shù)據(jù)庫的成熟技術(shù)和理念來提升大數(shù)據(jù)的能力呢?Apache Iceberg、Hudi 和 Delta Lake 這三個(gè)定位類似的開源項(xiàng)目正是從數(shù)據(jù)庫方法論中汲取了靈感,將事務(wù)能力帶到了大數(shù)據(jù)領(lǐng)域,并抽象成統(tǒng)一的中間格式供不同引擎適配對接。
如何定義這類新技術(shù)?
簡單地說,這類新技術(shù)是介于上層計(jì)算引擎和底層存儲(chǔ)格式之間的一個(gè)中間層,我們可以把它定義成一種“數(shù)據(jù)組織格式”,Iceberg 將其稱之為“表格式”也是表達(dá)類似的含義。它與底層的存儲(chǔ)格式(比如 ORC、Parquet 之類的列式存儲(chǔ)格式)最大的區(qū)別是,它并不定義數(shù)據(jù)存儲(chǔ)方式,而是定義了數(shù)據(jù)、元數(shù)據(jù)的組織方式,向上提供統(tǒng)一的“表”的語義。它構(gòu)建在數(shù)據(jù)存儲(chǔ)格式之上,其底層的數(shù)據(jù)存儲(chǔ)仍然使用 Parquet、ORC 等進(jìn)行存儲(chǔ)。
Apache Iceberg、Hudi 和 Delta Lake 誕生于不同公司,需要解決的問題存在差異,因此三者在設(shè)計(jì)初衷上稍有不同。
其中,Iceberg 的設(shè)計(jì)初衷更傾向于定義一個(gè)標(biāo)準(zhǔn)、開放且通用的數(shù)據(jù)組織格式,同時(shí)屏蔽底層數(shù)據(jù)存儲(chǔ)格式上的差異,向上提供統(tǒng)一的操作 API,使得不同的引擎可以通過其提供的 API 接入;Hudi 的設(shè)計(jì)初衷更像是為了解決流式數(shù)據(jù)的快速落地,并能夠通過 upsert 語義進(jìn)行延遲數(shù)據(jù)修正;Delta Lake 作為 Databricks 開源的項(xiàng)目,更側(cè)重于在 Spark 層面上解決 Parquet、ORC 等存儲(chǔ)格式的固有問題,并帶來更多的能力提升。
雖然這三個(gè)項(xiàng)目在設(shè)計(jì)初衷上稍有不同,但實(shí)現(xiàn)的思路和提供的能力卻非常相似,他們都提供了 ACID 的能力,都基于樂觀鎖實(shí)現(xiàn)了沖突解決和提供線性一致性,同時(shí)相應(yīng)地提供了 time travel 的功能。
但是因?yàn)樵O(shè)計(jì)初衷的不同,三個(gè)項(xiàng)目當(dāng)前的能力象限各有不同,Iceberg 在其格式定義和核心能力上最為完善,但是上游引擎的適配上稍顯不足;Hudi 基于 Spark 打造了完整的流式數(shù)據(jù)落地方案,但是其核心抽象較弱,與 Spark 耦合較緊;Delta Lake 同樣高度依賴于 Spark 生態(tài)圈,與其他引擎的適配尚需時(shí)日。不過邵賽賽認(rèn)為,這三個(gè)項(xiàng)目現(xiàn)有的差異會(huì)隨著社區(qū)的推動(dòng)和改進(jìn)以及時(shí)間的累積慢慢磨平,最終可能會(huì)變得更趨于相同。
Apache Iceberg 在騰訊的采用情況
騰訊在 Iceberg 還未進(jìn)入 Apache 孵化器時(shí)就已經(jīng)開始關(guān)注,隨著這幾個(gè)技術(shù)的開源以及進(jìn)入孵化器,這一領(lǐng)域開始逐漸升溫,從 2019 年下半年開始,騰訊正式在該技術(shù)上進(jìn)行探索和投入。
為什么選擇 Iceberg?
談及引入 Iceberg 的原因,邵賽賽表示,當(dāng)時(shí)團(tuán)隊(duì)在構(gòu)建大數(shù)據(jù)生態(tài)的過程中遇到了幾個(gè)痛點(diǎn),而 Iceberg 恰好能解決這幾個(gè)痛點(diǎn):
T+0 的數(shù)據(jù)落地和處理。傳統(tǒng)的數(shù)據(jù)處理流程從數(shù)據(jù)入庫到數(shù)據(jù)處理通常需要一個(gè)較長的環(huán)節(jié)、涉及許多復(fù)雜的邏輯來保證數(shù)據(jù)的一致性,由于架構(gòu)的復(fù)雜性使得整個(gè)流水線具有明顯的延遲。Iceberg 的 ACID 能力可以簡化整個(gè)流水線的設(shè)計(jì),降低整個(gè)流水線的延遲。
降低數(shù)據(jù)修正的成本。傳統(tǒng) Hive/Spark 在修正數(shù)據(jù)時(shí)需要將數(shù)據(jù)讀取出來,修改后再寫入,有極大的修正成本。Iceberg 所具有的修改、刪除能力能夠有效地降低開銷,提升效率。
至于為何最終選擇采用 Iceberg,而不是其他兩個(gè)開源項(xiàng)目,技術(shù)方面的考量主要有以下幾點(diǎn):
Iceberg 的架構(gòu)和實(shí)現(xiàn)并未綁定于某一特定引擎,它實(shí)現(xiàn)了通用的數(shù)據(jù)組織格式,利用此格式可以方便地與不同引擎(如 Flink、Hive、Spark)對接,這對于騰訊內(nèi)部落地是非常重要的,因?yàn)樯舷掠螖?shù)據(jù)管道的銜接往往涉及到不同的計(jì)算引擎;
良好的架構(gòu)和開放的格式。相比于 Hudi、Delta Lake,Iceberg 的架構(gòu)實(shí)現(xiàn)更為優(yōu)雅,同時(shí)對于數(shù)據(jù)格式、類型系統(tǒng)有完備的定義和可進(jìn)化的設(shè)計(jì);
面向?qū)ο蟠鎯?chǔ)的優(yōu)化。Iceberg 在數(shù)據(jù)組織方式上充分考慮了對象存儲(chǔ)的特性,避免耗時(shí)的 listing 和 rename 操作,使其在基于對象存儲(chǔ)的數(shù)據(jù)湖架構(gòu)適配上更有優(yōu)勢。
除去技術(shù)上的考量,邵賽賽和團(tuán)隊(duì)也對代碼質(zhì)量、社區(qū)等方面做了詳細(xì)的評(píng)估:
整體的代碼質(zhì)量以及未來的進(jìn)化能力。整體架構(gòu)代碼上的抽象和優(yōu)勢,以及這些優(yōu)勢對于未來進(jìn)行演化的能力是團(tuán)隊(duì)非常關(guān)注的。一門技術(shù)需要能夠在架構(gòu)上持續(xù)演化,而不會(huì)具體實(shí)現(xiàn)上需要大量的不兼容重構(gòu)才能支持。
社區(qū)的潛力以及騰訊能夠在社區(qū)發(fā)揮的價(jià)值。社區(qū)的活躍度是另一個(gè)考量,更重要的是在這個(gè)社區(qū)中騰訊能做些什么,能發(fā)揮什么樣的價(jià)值。如果社區(qū)相對封閉或已經(jīng)足夠成熟,那么騰訊再加入后能發(fā)揮的價(jià)值就沒有那么大了,在選擇技術(shù)時(shí)這也是團(tuán)隊(duì)的一個(gè)重要考量點(diǎn)。
技術(shù)的中立性和開放性。社區(qū)能夠以開放的態(tài)度去推動(dòng)技術(shù)的演化,而不是有所保留地向社區(qū)貢獻(xiàn),同時(shí)社區(qū)各方相對中立而沒有一個(gè)相對的強(qiáng)勢方來完全控制社區(qū)的演進(jìn)。
優(yōu)化和改進(jìn)
從正式投入研發(fā)到現(xiàn)在,騰訊在開源版本的基礎(chǔ)上對 Iceberg 進(jìn)行了一些優(yōu)化和改進(jìn),主要包括:
實(shí)現(xiàn)了行級(jí)的刪除和更新操作,極大地節(jié)省了數(shù)據(jù)修正和刪除所帶來的開銷;
對 Spark 3.0 的 DataSource V2 進(jìn)行了適配,使用 Spark 3.0 的 SQL 和 DataFrame 可以無縫對接 Iceberg 進(jìn)行操作;
增加了對 Flink 的支持,可以對接 Flink 以 Iceberg 的格式進(jìn)行數(shù)據(jù)落地。
這些改進(jìn)點(diǎn)提高了 Iceberg 在落地上的可用性,也為它在騰訊內(nèi)部落地提供了更為吸引人的特性。同時(shí)騰訊也在積極擁抱社區(qū),大部分的內(nèi)部改進(jìn)都已推往社區(qū),一些內(nèi)部定制化的需求也會(huì)以更為通用的方式貢獻(xiàn)回社區(qū)。
目前團(tuán)隊(duì)正在積極嘗試將 Iceberg 融入到騰訊的大數(shù)據(jù)生態(tài)中,其中最主要的挑戰(zhàn)在于如何與騰訊現(xiàn)有系統(tǒng)以及自研系統(tǒng)適配,以及如何在一個(gè)成熟的大數(shù)據(jù)體系中尋找落地點(diǎn)并帶來明顯的收益。邵賽賽具體提到了以下幾點(diǎn):
Iceberg 的上下游配套能力的建設(shè)相對缺乏,需要較多的配套能力的建設(shè),比如 Spark、Hive、Flink 等不同引擎的適配;
其次是 Iceberg 核心能力成熟度的驗(yàn)證,它是否能夠支撐起騰訊大數(shù)據(jù)量級(jí)的考驗(yàn),其所宣稱的能力是否真正達(dá)到了企業(yè)級(jí)可用,都需要進(jìn)一步驗(yàn)證和加強(qiáng);
最后,騰訊內(nèi)部大數(shù)據(jù)經(jīng)過多年發(fā)展,已經(jīng)形成了一整套完整的數(shù)據(jù)接入分析方案,Iceberg 如何能夠在內(nèi)部落地,優(yōu)化現(xiàn)有的方案非常重要。
Iceberg 的不足和未來
Iceberg 誕生的時(shí)間不長,雖然擁有高度抽象和非常優(yōu)雅的設(shè)計(jì),但功能上仍有不足,尤其在圍繞生態(tài)系統(tǒng)的建立和周邊能力的打造上還有很多工作需要做。邵賽賽認(rèn)為,當(dāng)前 Iceberg 最重要的缺失點(diǎn)是和上層引擎的對接。現(xiàn)在 Iceberg 和 Spark 的對接是最為完善的,但是由于 DataSource V2 API 仍在不斷地改進(jìn)中,對于一些語義的下推仍然缺失,因此能力上和內(nèi)置的存儲(chǔ)格式相比仍有欠缺(比如 bucket join 的支持)。而對于 Hive、Flink 的支持尚在開發(fā)中。因?yàn)?Iceberg 是一個(gè)統(tǒng)一的數(shù)據(jù)組織格式,想要全面使用的話必須使所有的上層引擎能夠?qū)舆m配,因此這一塊環(huán)節(jié)的補(bǔ)足是當(dāng)前最為重要的。
其次,Iceberg 缺少行級(jí)更新、刪除能力。騰訊內(nèi)部已經(jīng)為 Iceberg 增加了行級(jí)更新、刪除的能力,但在 Iceberg 社區(qū)尚未有這樣的能力,這些能力所需的格式定義仍在設(shè)計(jì)中。行級(jí)更新、刪除能力是現(xiàn)有數(shù)據(jù)組織格式的最大賣點(diǎn),因此該功能的補(bǔ)強(qiáng)對于 Iceberg 的推廣和落地十分重要。
在騰訊內(nèi)部,后續(xù)對于 Iceberg 的規(guī)劃主要還是以適配不同的引擎以及優(yōu)化核心能力為主,同時(shí)會(huì)圍繞 Iceberg 和上下游的引擎提供端到端的面向終端用戶的數(shù)據(jù)管道能力。
目前相比于 Hudi、Delta Lake,Iceberg 在國內(nèi)的關(guān)注度較少,這主要是由于其主要開發(fā)團(tuán)隊(duì)在技術(shù)推廣和運(yùn)營上面的工作偏少,而且 Iceberg 的開發(fā)者多為海外開發(fā)者,但是現(xiàn)在已經(jīng)有越來越多大公司加入到了 Iceberg 的貢獻(xiàn)中,包括 Netflix、Apple、Adobe、Expedia 等國外大廠,也包括騰訊、阿里、網(wǎng)易等國內(nèi)公司。邵賽賽非常看好 Iceberg 未來在國內(nèi)發(fā)展的前景,在他看來,一個(gè)好的技術(shù)架構(gòu)可能暫時(shí)不引人矚目,但最終還是會(huì)得到更多人的認(rèn)可。隨著國內(nèi)推廣的增多,以及國內(nèi)開發(fā)者在這個(gè)項(xiàng)目上的投入、運(yùn)營,未來在國內(nèi) Iceberg 前景可期。