天天看點

Delta Lake - 資料湖的資料可靠性

今天筆者将分享一位大神關于 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 内容,思考一番,然後再檢視筆者的解讀。

抛出問題

Delta Lake - 資料湖的資料可靠性

很多企業使用 Apache Spark 将各種資料導入到資料湖(data lake)中,在這個過程會花費很多money。

但是至少資料都進到資料湖,是不是看起來很美好。

Delta Lake - 資料湖的資料可靠性

然後渴望使用 Apache Spark 基于資料湖存儲的海量資料進行資料科學分析和機器學習(ML)。

開始幹活了,是不是真的很美好。

Delta Lake - 資料湖的資料可靠性

OMG,出問題了,一堆資料大部分都是不可靠的,導緻大部分項目都失敗了。這是因為資料科學分析和機器學習對資料品質要求非常高。

看來,美好隻是想想而已,别當真。

資料湖的模樣

Delta Lake - 資料湖的資料可靠性

那麼,你期望的資料湖是什麼樣子的?

  • 可能是收集所有的資料,比如客戶資料、視訊/語音、點選流、傳感器資料等
  • 不是傳統的 RDBMS,不需要提前設定 Schema
  • 基于資料湖進行科學分析和機器學習,用于推薦引擎、風險/欺詐檢測、IoT等

但是問題是,通常你的資料是 garbage(不要驚訝,沒分析之前的确是),也就是資料湖裡面存儲的都是 garbage,是以 garbage out 給推薦引擎的都是無用資料,導緻輸出沒有意義的結果。

Delta Lake - 資料湖的資料可靠性

那麼一個典型的資料湖項目看起來是什麼樣子呢?如果不太清楚,就繼續看。

Delta Lake - 資料湖的資料可靠性

一天 boss 跑過來說,兄dei,所有資料都進到 Kafka,現在要出需求了,兩個任務,一個是 Streaming Analytics,實時檢視 Business 運作情況等;另外一個任務是進行更加複雜的 AI 和 Reporting 分析,檢視更多名額的洞察報告。

那我們如何做,怎麼開始呢?

Delta Lake - 資料湖的資料可靠性

OK,引入 Apache Spark,因為 Spark API 可以消費 Kafka 資料,然後進行基于 DataFrame 和 DataSet 對資料進行各種計算包括實時視窗聚合操作,可以實時分析商業業務名額,但是有沒有發現,很難處理以前曆史資料,比如一年前的資料分析,以及更新的曆史資料情況。

Delta Lake - 資料湖的資料可靠性

上面就是我們遇到的一個 Challenge #1: Historical Queries?

針對上面的問題,是以要把 Kafka 資料導入資料湖,保留曆史,以備 boss 不時之需。其實上圖就是典型的 lambda 架構,這樣就可以解決實時和曆史資料查詢的問題。

Delta Lake - 資料湖的資料可靠性

但是我們又發現了另外一個問題:散亂的資料,Challenge #2: Messy Data?

如上圖所示,我們需要啟動額外的 Spark Jobs 來檢查資料品質,如果出問題要及時告警,友善及時修複,即上圖中加入 Validation 可以解決問題。

Delta Lake - 資料湖的資料可靠性

加入 Validation 校驗資料品質功能後,的确很棒,又會帶來新的問題,Challenge #3: Mistakes and Failures?

有時可能會丢失什麼,資料一旦存儲在資料湖中,那麼怎麼修複呢,可能需要不停的調整,根據時間、區域等建立分區目錄等,進行計算,如果錯誤的話,删除分區目錄,再重新處理。

Delta Lake - 資料湖的資料可靠性

上面引入 Reprocessing 架構,就需要更新資料,涉及 Challenge #4: Updates?

更新就要考慮事務,多版本等等一系列情況。

Delta Lake - 資料湖的資料可靠性

本來你就想靜靜地做個 Reporting、ML等,終将你會入坑,徘徊在以下幾個問題當中:

  • Wasting Time & Money
  • Solving Systems Problems
  • Instead of Extracting Value From Data
Delta Lake - 資料湖的資料可靠性
  • 沒有原子性意味着失敗的生産作業會使資料處于損壞狀态,需要繁瑣的恢複操作
  • 沒有品質強制執行會産生不一緻和不可用的資料
  • 沒有一緻性/隔離性,就基本不可能混合追加和讀取、批處理和流處理

到此,遇到的問題一堆,于是提出解決方案 Delta Lake。

Delta Lake 解決方案

Delta Lake - 資料湖的資料可靠性
Delta Lake - 資料湖的資料可靠性

回顧一下,我們在上面建構的整個系統,融入各種解決方案的資料湖,是不是有點複雜而且雜亂。

Delta Lake 将上面的整體解決方案轉變為下圖的解決方案。

Delta Lake - 資料湖的資料可靠性

是不是覺得柳暗花明又一村,現在你隻需要關注 data flow。

Delta Lake - 資料湖的資料可靠性
Delta Lake - 資料湖的資料可靠性
Delta Lake - 資料湖的資料可靠性

這裡,筆者把三個 slides 都放在一起了,Delta Lake 帶來了幾個關鍵的特性:

  • 支援 ACID 事務
  • 開放标準、開放源碼(Apache License),存儲 PB 級的資料。不斷增長的社群包括 Presto, Spark 等
  • Apache Spark 支援,流批統一
Delta Lake - 資料湖的資料可靠性

Delta Lake 提供了一種工具,可以增量地提高資料品質,直到可以被有意義地消費。在 Delta Lake 中,資料被劃分成了三個資料品質邏輯層次:

  • Bronze
  • Silver
  • Gold

下面會依次介紹功能和作用。

Delta Lake - 資料湖的資料可靠性

Bronze 層主要用于存儲原始資料,即所謂的 Raw Data 。Delta Lake是一個資料湖存儲引擎,可以支援各種各樣的資料接入,這些資料源可能是 Kafka、Kinesis、Spark 或者是其他資料湖,這些資料接入 Delta Lake 之後就存儲在Bronze 層,Bronze 層可以為大資料常用的分布式存儲 HDFS 或其他存儲,這也保證了資料湖中資料存儲的可擴充性。

Delta Lake - 資料湖的資料可靠性

Silver 層主要用于存儲經過初步處理(解析 Json格式、增加 Schema、過濾、清理、Join等)的資料。存儲 Silver 中間資料主要有兩方面好處:

  • 對企業的很多人來說有價值,資料共享
  • 這些中間資料可查詢,便于調試
    Delta Lake - 資料湖的資料可靠性

Gold 層可以直接用來消費,可以給業務層直接使用,這些資料是處理後的可以被 ML 或 Tableau 等使用。可以使用 Spark 或者 Presto 在Gold層上直接做展現,或者在這些資料上做資料挖掘。

Delta Lake - 資料湖的資料可靠性

其實就是 Streams,資料流,通過 Delta Lake 增量地在不同層傳送資料。

Delta Lake - 資料湖的資料可靠性

可能有的人說我不需要實時資料,我的報表每小時、每天或每月運作一次。但是 Streaming 并不是總是指低延時(low latency),而是關于持續增量地處理資料,不用去管什麼資料是新的,哪些資料是舊的,已經處理哪些資料,如何從失敗中恢複等,Streaming 考慮了這一切。Delta Lake 當然也支援批處理作業和标準的 DML。

Delta Lake - 資料湖的資料可靠性

最後,介紹一個比較酷的模式,recomputation,重新計算。因為我們在初始的 Bronze 存儲了所有 Raw Data ,使用 Streaming 處理這些資料。如果發現代碼存在 bug 或者存在一些未曾發覺的新需求,需要加入到分析系統,我們需要做的就是清理表的資料、清理掉 Checkpoint 并重新開機 Streaming。

廣告時間

Delta Lake - 資料湖的資料可靠性
Delta Lake - 資料湖的資料可靠性
Delta Lake - 資料湖的資料可靠性

直接看,沒有什麼補充的。

如何使用 Delta Lake

Delta Lake - 資料湖的資料可靠性

這一塊内容,筆者在之前的文章中,非常詳細地實戰過,這裡的确不太适合再說。

資料品質

Delta Lake - 資料湖的資料可靠性

這裡建立了一張 warehouse 的表,定義一些屬性,包括存儲路徑、Schema等。

Delta Lake - 資料湖的資料可靠性

其實這裡更關注的是特性是 expect,定義對資料品質的要求。關于資料品質這一塊,大資料行業也是一直比較關注的,開源的産品也有幾個,比如 Apache Griffin 等。

Delta Lake 資料品質,以後筆者會單獨細說。

Delta Lake 如何工作

這部分 slides 的内容,筆者都曾帶領大家詳細的研究和實戰過,這裡為了該演講内容的完整性,都帶上。

Delta Lake - 資料湖的資料可靠性

存儲可以有HDFS、S3 或其他 BlobStore 等。

Delta Lake - 資料湖的資料可靠性

資料表由一系列操作集合的資料資訊組成的結果。

Delta Lake - 資料湖的資料可靠性
Delta Lake - 資料湖的資料可靠性
Delta Lake - 資料湖的資料可靠性
Delta Lake - 資料湖的資料可靠性

Roadmap

Delta Lake - 資料湖的資料可靠性

這個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氛圍,歡迎釘釘掃碼加入!

Delta Lake - 資料湖的資料可靠性

對開源大資料和感興趣的同學可以加小編微信(下圖二維碼,備注“進群”)進入技術交流微信群。

Delta Lake - 資料湖的資料可靠性