認識 Delta Lake

語言: CN / TW / HK

百花齊放的大資料生態

17,18是計算引擎火熱的兩年,19年已然是紅海了。計算引擎中的王者是Spark,綜合指標最好,生態也好,當其他引擎還在ETL,互動查詢,流上廝殺時,Spark已經在AI領域越走越遠。

​對比明顯的是,計算層的上層和下層在17,18年卻乏善可陳。但是到19年整個局勢開發生變化,向下走是儲存層Delta Lake耀眼奪目,解決了原先數倉的諸多痛點,讓數倉進化到資料湖。向上走是互動應用層的Linkis一馬當先,形成互動標準,粘合周邊生態,很好的銜接了應用互動層和計算引擎層的銜接。

問題重重的資料儲存層

前面我們提到,早先基於Hive的數倉或者傳統的檔案儲存形式(比如Parquet/ORC),都存在一些長期難以解決的問題:

  • 小檔案的問題
  • 併發讀寫問題
  • 有限的更新支援
  • 海量元資料(例如分割槽)導致Hive metastore不堪重負

細節展開的話,你會發現每一個問題又會引發眾多應用場景層面的問題。

比如併發讀寫還有更新問題讓實時數倉的實現變得很困難。小檔案問題需要我們自己寫合併程式碼,並且在合併過程中還會造成資料不可讀的問題。如此種種不一而足。

為了解決這些先天不足的問題,我們只能通過複雜的架構設計來解決這些問題(美其名曰lambda架構)。比如為了解決先天不足的更新問題,我們可能需要先將資料寫入一個其他的系統(如HBase),然後再將HBase匯出成Parquet檔案/Hive表供下游使用。在複雜的流程(超長的Pipeline)執行的過程中,還會不斷涉及到Schema的變換以及磁碟的讀取,所以架構複雜了不僅僅會導致運維成本高企,CPU/IO浪費也就變得異常嚴重。

其實上面這些問題的根源,都是因為儲存層不給力,為了曲線救國,我們無奈通過架構來彌補。Delta Lake單刀直入,直接解決儲存層的問題,帶來的益處就是極大的簡化我們的架構設計,簡化運維成本,降低伺服器成本。

Delta Lake 生之逢時

天下苦傳統數倉久已,Delta Lake 橫空出世,那麼它是如何解決上面的儲存層問題呢?我列舉了如下幾個重要的特性:

以元資料也是大資料思想武裝自己,設計了基於HDFS儲存的元資料系統,解決metastore不堪重負的問題。

支援更多種類的更新模式,比如Merge/Update/Delete等操作,配合流式寫入或者讀取的支援,讓實時資料湖變得水到渠成。

流批操作可以共享同一張表版本概念,可以隨時回溯,避免一次誤操作或者程式碼邏輯而無法恢復的災難性後果。

Delta Lake 其實只是一個Lib庫

Delta Lake 是一個lib 而不是一個service,不同於HBase,他不需要單獨部署,而是直接依附於計算引擎的。目前只支援Spark引擎。這意味什麼呢?Delta Lake 和普通的parquet檔案使用方式沒有任何差異,你只要在你的Spark程式碼專案裡引入delta包,按標準的Spark datasource操作即可,可謂部署和使用成本極低。

Delta Lake到底是什麼

Parquet檔案 + Meta 檔案 + 一組操作的API = Delta Lake.

所以Delta沒啥神祕的,和parquet沒有任何區別。但是他通過meta檔案以及相應的API,提供眾多特性功能的支援。在Spark中使用它和使用parquet的唯一區別就是把format parquet換成detla。

和Hive如何整合

因為慣性以及歷史的積累,大家還是希望能像使用hive那樣使用delta,而不是去使用spark的datasource API。截止到筆者寫這些文字之前,官方還沒有支援。不過官方透露阿里的同學已經在做這塊的整合。另外最近版本的Delta Lake已經通過Manifests機制允許比如Presto之類的讀取資料了。

競爭對手

Apache Delta目前主要的競爭對手是Apache Hudi 以及 Apache IceBerg。我們統稱為資料湖三駕馬車。最後誰能走出來,拭目以待了。對於這三者之間總結性質的區別和看法,我引用邵賽賽的一段話,我覺得他總結的足夠好了:

Iceberg 的設計初衷更傾向於定義一個標準、開放且通用的資料組織格式,同時遮蔽底層資料儲存格式上的差異,向上提供統一的操作 API,使得不同的引擎可以通過其提供的 API 接入;Hudi 的設計初衷更像是為了解決流式資料的快速落地,並能夠通過 upsert 語義進行延遲資料修正;Delta Lake 作為 Databricks 開源的專案,更側重於在 Spark 層面上解決 Parquet、ORC 等儲存格式的固有問題,並帶來更多的能力提升。他們都提供了 ACID 的能力,都基於樂觀鎖實現了衝突解決和提供線性一致性,同時相應地提供了 time travel 的功能。

因為引用限制的問題,大家可以看看原文。

=========

歡迎大家關注我公眾號 【祝威廉】