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 內容,思考一番,然后再查看筆者的解讀。
拋出問題
很多企業使用 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 中間數據主要有兩方面好處:
-
對企業的很多人來說有價值,數據共享
-
這些中間數據可查詢,便于調試
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 演講的內容比較詳細地過了一遍,大家慢慢消化。
?
?
相關閱讀推薦
【譯】Delta Lake 0.4.0 新特性演示:使用 Python API 就地轉換與處理 Delta Lake 表
【譯】數據湖正在成為新的數據倉庫
總結
以上是生活随笔為你收集整理的Delta Lake——数据湖的可靠性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最简单的设置按钮的鼠标悬停效果
- 下一篇: 数据埋点太难!知乎的做法有何可借鉴之处?