今天筆者将分享一位大神關于 Delta Lake 的演講内容。這位是 Apache Spark 的 committer 和 PMC 成員,也是 Spark SQL 的最初建立者,目前上司 Databricks 團隊,設計和建構 Structured Streaming 和 Databricks Delta,技術涉及分布式系統、大規模結構化存儲和查詢優化等方面。
這位大神就是 Michael Armbrust。
Delta Lake 回顧
前面的文章對于 Delta Lake 介紹很多,為了友善新的讀者更快了解項目,這裡簡要說明:
Delta Lake 是一個開源的存儲層,為資料湖帶來了可靠性。Delta Lake 提供了ACID事務、可伸縮的中繼資料處理以及統一的流和批資料處理。它運作在現有的資料湖之上,與 Apache Spark API完全相容。
因為 Michael 的演講視訊我也是粗略聽過,到現在也忘記差不多了。不過,根據 slides 的内容,我盡量串起來,讓讀者明白。
筆者的注解基本都在每個 slide 的下方,為了讓讀者先檢視 slides 内容,思考一番,然後再檢視筆者的解讀。
抛出問題

很多企業使用 Apache Spark 将各種資料導入到資料湖(data lake)中,在這個過程會花費很多money。
但是至少資料都進到資料湖,是不是看起來很美好。
然後渴望使用 Apache Spark 基于資料湖存儲的海量資料進行資料科學分析和機器學習(ML)。
開始幹活了,是不是真的很美好。
OMG,出問題了,一堆資料大部分都是不可靠的,導緻大部分項目都失敗了。這是因為資料科學分析和機器學習對資料品質要求非常高。
看來,美好隻是想想而已,别當真。
資料湖的模樣
那麼,你期望的資料湖是什麼樣子的?
- 可能是收集所有的資料,比如客戶資料、視訊/語音、點選流、傳感器資料等
- 不是傳統的 RDBMS,不需要提前設定 Schema
- 基于資料湖進行科學分析和機器學習,用于推薦引擎、風險/欺詐檢測、IoT等
但是問題是,通常你的資料是 garbage(不要驚訝,沒分析之前的确是),也就是資料湖裡面存儲的都是 garbage,是以 garbage out 給推薦引擎的都是無用資料,導緻輸出沒有意義的結果。
那麼一個典型的資料湖項目看起來是什麼樣子呢?如果不太清楚,就繼續看。
一天 boss 跑過來說,兄dei,所有資料都進到 Kafka,現在要出需求了,兩個任務,一個是 Streaming Analytics,實時檢視 Business 運作情況等;另外一個任務是進行更加複雜的 AI 和 Reporting 分析,檢視更多名額的洞察報告。
那我們如何做,怎麼開始呢?
OK,引入 Apache Spark,因為 Spark API 可以消費 Kafka 資料,然後進行基于 DataFrame 和 DataSet 對資料進行各種計算包括實時視窗聚合操作,可以實時分析商業業務名額,但是有沒有發現,很難處理以前曆史資料,比如一年前的資料分析,以及更新的曆史資料情況。
上面就是我們遇到的一個 Challenge #1: Historical Queries?
針對上面的問題,是以要把 Kafka 資料導入資料湖,保留曆史,以備 boss 不時之需。其實上圖就是典型的 lambda 架構,這樣就可以解決實時和曆史資料查詢的問題。
但是我們又發現了另外一個問題:散亂的資料,Challenge #2: Messy Data?
如上圖所示,我們需要啟動額外的 Spark Jobs 來檢查資料品質,如果出問題要及時告警,友善及時修複,即上圖中加入 Validation 可以解決問題。
加入 Validation 校驗資料品質功能後,的确很棒,又會帶來新的問題,Challenge #3: Mistakes and Failures?
有時可能會丢失什麼,資料一旦存儲在資料湖中,那麼怎麼修複呢,可能需要不停的調整,根據時間、區域等建立分區目錄等,進行計算,如果錯誤的話,删除分區目錄,再重新處理。
上面引入 Reprocessing 架構,就需要更新資料,涉及 Challenge #4: Updates?
更新就要考慮事務,多版本等等一系列情況。
本來你就想靜靜地做個 Reporting、ML等,終将你會入坑,徘徊在以下幾個問題當中:
- Wasting Time & Money
- Solving Systems Problems
- Instead of Extracting Value From Data
- 沒有原子性意味着失敗的生産作業會使資料處于損壞狀态,需要繁瑣的恢複操作
- 沒有品質強制執行會産生不一緻和不可用的資料
- 沒有一緻性/隔離性,就基本不可能混合追加和讀取、批處理和流處理
到此,遇到的問題一堆,于是提出解決方案 Delta Lake。
Delta Lake 解決方案
回顧一下,我們在上面建構的整個系統,融入各種解決方案的資料湖,是不是有點複雜而且雜亂。
Delta Lake 将上面的整體解決方案轉變為下圖的解決方案。
是不是覺得柳暗花明又一村,現在你隻需要關注 data flow。
這裡,筆者把三個 slides 都放在一起了,Delta Lake 帶來了幾個關鍵的特性:
- 支援 ACID 事務
- 開放标準、開放源碼(Apache License),存儲 PB 級的資料。不斷增長的社群包括 Presto, Spark 等
- Apache Spark 支援,流批統一
Delta Lake 提供了一種工具,可以增量地提高資料品質,直到可以被有意義地消費。在 Delta Lake 中,資料被劃分成了三個資料品質邏輯層次:
- Bronze
- Silver
- Gold
下面會依次介紹功能和作用。
Bronze 層主要用于存儲原始資料,即所謂的 Raw Data 。Delta Lake是一個資料湖存儲引擎,可以支援各種各樣的資料接入,這些資料源可能是 Kafka、Kinesis、Spark 或者是其他資料湖,這些資料接入 Delta Lake 之後就存儲在Bronze 層,Bronze 層可以為大資料常用的分布式存儲 HDFS 或其他存儲,這也保證了資料湖中資料存儲的可擴充性。
Silver 層主要用于存儲經過初步處理(解析 Json格式、增加 Schema、過濾、清理、Join等)的資料。存儲 Silver 中間資料主要有兩方面好處:
- 對企業的很多人來說有價值,資料共享
- 這些中間資料可查詢,便于調試
Delta Lake - 資料湖的資料可靠性
Gold 層可以直接用來消費,可以給業務層直接使用,這些資料是處理後的可以被 ML 或 Tableau 等使用。可以使用 Spark 或者 Presto 在Gold層上直接做展現,或者在這些資料上做資料挖掘。
其實就是 Streams,資料流,通過 Delta Lake 增量地在不同層傳送資料。
可能有的人說我不需要實時資料,我的報表每小時、每天或每月運作一次。但是 Streaming 并不是總是指低延時(low latency),而是關于持續增量地處理資料,不用去管什麼資料是新的,哪些資料是舊的,已經處理哪些資料,如何從失敗中恢複等,Streaming 考慮了這一切。Delta Lake 當然也支援批處理作業和标準的 DML。
最後,介紹一個比較酷的模式,recomputation,重新計算。因為我們在初始的 Bronze 存儲了所有 Raw Data ,使用 Streaming 處理這些資料。如果發現代碼存在 bug 或者存在一些未曾發覺的新需求,需要加入到分析系統,我們需要做的就是清理表的資料、清理掉 Checkpoint 并重新開機 Streaming。
廣告時間
直接看,沒有什麼補充的。
如何使用 Delta Lake
這一塊内容,筆者在之前的文章中,非常詳細地實戰過,這裡的确不太适合再說。
資料品質
這裡建立了一張 warehouse 的表,定義一些屬性,包括存儲路徑、Schema等。
其實這裡更關注的是特性是 expect,定義對資料品質的要求。關于資料品質這一塊,大資料行業也是一直比較關注的,開源的産品也有幾個,比如 Apache Griffin 等。
Delta Lake 資料品質,以後筆者會單獨細說。
Delta Lake 如何工作
這部分 slides 的内容,筆者都曾帶領大家詳細的研究和實戰過,這裡為了該演講内容的完整性,都帶上。
存儲可以有HDFS、S3 或其他 BlobStore 等。
資料表由一系列操作集合的資料資訊組成的結果。
Roadmap
這個Roadmap有點老了,截至目前,Delta Lake 釋出的版本為 0.4.0,支援:
-
Python APIs for DML and utility operations
You can now use Python APIs to update/delete/merge data in Delta Lake tables and to run utility operations (i.e., vacuum, history) on them.
-
Convert-to-Delta
You can now convert a Parquet table in place to a Delta Lake table without rewriting any of the data. This is great for converting very large Parquet tables which would be costly to rewrite as a Delta table. Furthermore, this process is reversible - you can convert a Parquet table to Delta Lake table, operate on it (e.g., delete or merge), and easily convert it back to a Parquet table.
-
SQL for utility operations
You can now use SQL to run utility operations vacuum and history.
到此,Michael 演講的内容比較詳細地過了一遍,大家慢慢消化。
本文轉載自公衆号:DataFlow範式
作者Jason
相關閱讀推薦
【譯】Delta Lake 0.4.0 新特性示範:使用 Python API 就地轉換與處理 Delta Lake 表 【譯】資料湖正在成為新的資料倉庫阿裡巴巴開源大資料技術團隊成立Apache Spark中國技術社群,定期推送精彩案例,技術專家直播,問答區近萬人Spark技術同學線上提問答疑,隻為營造純粹的Spark氛圍,歡迎釘釘掃碼加入!
對開源大資料和感興趣的同學可以加小編微信(下圖二維碼,備注“進群”)進入技術交流微信群。