首頁 > 科技 > 正文

Spark 開源新技術 Delta Lake 介紹


更新日期:2019-10-18 20:17:54來源:網絡點擊:1495864
她的睫毛,她穿上公主裝,她說吉他譜,碧螺春產于哪里,碧螺春產于,碧螺春產地

At the beginning


3年前,我加入了一個數據倉庫項目組。隨著數據的不斷增長,當時的項目慢慢從一個數據倉庫退化成了數據湖。我們首先來看一下業界目前對數據倉庫和數據湖的定義:

被許多人認為是數據倉庫之父的Bill Inmon曾經對數據倉庫做過如下定義:

數據倉庫是一個優化的數據分析系統,用于分析來自事務系統和業務線應用程序的關系數據。事先定義數據結構和 Schema 以優化快速 SQL 查詢,其中結果通常用于操作報告和分析。數據經過了清理、豐富和轉換,因此可以充當用戶可信任的“單一信息源”。

數據湖有所不同,數據湖概念的誕生,源自企業面臨的一些挑戰,如數據應該以何種方式處理和存儲。因為它存儲來自業務線應用程序的關系數據,以及來自移動應用程序、IoT 設備和社交媒體的非關系數據。捕獲數據時,未定義數據結構或 Schema。這意味著您可以存儲所有數據,而不需要精心設計也無需知道將來您可能需要哪些問題的答案。可以對數據使用不同類型的分析(如 SQL 查詢、大數據分析、全文搜索、實時分析和機器學習)來獲得見解。


通過上面的分析我們可以看出來數據倉庫如果管理不完善會慢慢演化成了一個數據湖,數據倉庫中有時會存在多種多樣各種格式的幾十P原始數據,原始數據的存儲十分便捷并且可以擴展,進而成為了各種業務的上游,比如ML、風控數據挖掘、BI等等,所以實際上演化成了一個標準的數據湖項目。

而大部分數據并沒有得到很好的應用,實際上我們是在做垃圾數據的存儲和處理,大部分Hadoop資源被浪費在了處理垃圾上。數據倉庫是一個已經存在了幾十年的概念,這里重點說明一下數據湖的價值和挑戰。

數據湖的價值

我們可以看到數據湖和數據倉庫最大的差別就是從Schema-on-write到Schema-on-read的轉變,數據湖能夠在更短的時間內從更多來源利用更多數據,并使用戶能夠以不同方式協同處理和分析數據,從而做出更好、更快的決策。

提高存儲效率 數據湖便捷擴展地特性可以帶來更高的存儲效率,在數據湖中存儲數據時我們不需要預先定義Schema,只需要將數據存入數據湖就可以

提高運營效率 數據湖Schema-on-read的方式可以已較低的存儲成本快速獲取到我們想要的結果,只需要對一些數據做預處理

數據湖的挑戰

數據湖架構的主要挑戰是存儲原始數據而不監督內容。對于使數據可用的數據湖,它需要有定義的機制來編目和保護數據。沒有這些元素,就無法找到或信任數據,從而導致出現“數據沼澤”。 滿足更廣泛受眾的需求需要數據湖具有管理、語義一致性和訪問控制。

對數據湖進行的讀寫操作不可靠。數據工程師經常遇到數據湖寫入不安全的問題,這會導致讀取方在寫入期間看到垃圾數據。它們必須構建變通方案,確保讀取方在寫操作期間看到的數據始終一致。

數據湖的數據質量較差。將非結構化數據轉儲到數據湖中很容易。但這是以數據質量為代價的。如果沒有任何機制驗證模式和數據,那么數據湖就會受到數據質量差的影響。因此,試圖挖掘這些數據的分析項目也會失敗。

隨著數據量的增加,性能變差。隨著轉儲到數據湖中的數據量的增加,文件和目錄的數量也會增加。處理數據的大數據作業和查詢引擎在處理元數據操作上花費了大量時間。這個問題在流作業的情況下會更加明顯。

更新數據湖中的記錄非常困難。工程師需要構建復雜的管道來讀取整個分區或表,修改數據并將其寫回。這樣的管道效率低下,難以維護。

針對這些挑戰,Spark的母公司Databricks最近開源了一款數據湖引擎Delta Lake,里面的很多feature看起來確實能夠解決數據湖的痛點

2. Data Analysis on Data Lake

2.1 數據湖的價值

我們可以看到數據湖和數據倉庫最大的差別就是從Schema-on-write到Schema-on-read的轉變,數據湖能夠在更短的時間內從更多來源利用更多數據,并使用戶能夠以不同方式協同處理和分析數據,從而做出更好、更快的決策。

提高存儲效率 數據湖便捷擴展地特性可以帶來更高的存儲效率,在數據湖中存儲數據時我們不需要預先定義Schema,只需要將數據存入數據湖就可以

提高運營效率 數據湖Schema-on-read的方式可以已較低的存儲成本快速獲取到我們想要的結果,只需要對一些數據做預處理

2.2 數據湖的挑戰

數據湖架構的主要挑戰是存儲原始數據而不監督內容。對于使數據可用的數據湖,它需要有定義的機制來編目和保護數據。沒有這些元素,就無法找到或信任數據,從而導致出現“數據沼澤”。 滿足更廣泛受眾的需求需要數據湖具有管理、語義一致性和訪問控制。這些挑戰也是一些管理不完善的數據倉庫目前正在面臨的一些嚴重問題(冗余數據非常多數據質量差冗余作業非常多數據查詢性能差):

讀寫操作不可靠。數據工程師經常遇到數據湖寫入不安全的問題,這會導致讀取方在寫入期間看到垃圾數據。它們必須構建變通方案,確保讀取方在寫操作期間看到的數據始終一致。

數據質量差,數據湖中可能存在很多不一致和冗余數據。將非結構化數據轉儲到數據湖中很容易。但這是以數據質量為代價的。如果沒有任何機制驗證模式和數據,那么數據湖就會受到數據質量差的影響。因此,試圖挖掘這些數據的分析項目也會失敗。

隨著數據量的增加,性能變差。隨著轉儲到數據湖中的數據量的增加,文件和目錄的數量也會增加。處理數據的大數據作業和查詢引擎在處理元數據操作上花費了大量時間。這個問題在流作業的情況下會更加明顯。

更新數據湖中的記錄非常困難。當我們發現我們的數據算法出錯的時候,我們可能要回溯半年甚至一年的數據,發起多個作業來做這件事情。工程師需要構建復雜的管道來讀取整個分區或表,修改數據并將其寫回。這樣的管道效率低下,難以維護,并且很容易出錯。

針對這些挑戰,如果要在Lambda架構做優化是十分困難的,我們需要花費大量的人力去做計算作業梳理、Checkpoint檢查、數據梳理、數據活躍性檢測等等。而Spark的母公司Databricks今年4月份開源了一款數據湖引擎 Delta Lake,嘗試用Spark的思想來解決數據湖的問題,里面的很多feature看起來確實能夠解決數據湖的痛點,我們下面來一起看一下:

DeltaLake解決了上述問題,簡化了數據湖構建。以下是DeltaLake提供的主要功能:

ACID 事務:Delta Lake 提供多個寫操作之間的 ACID 事務。每個寫操作都是一個事務,事務日志中記錄的寫操作有一個串行順序。事務日志會跟蹤文件級的寫操作,并使用 樂觀并發控制,這非常適合數據湖,因為嘗試修改相同文件的多個寫操作并不經常發生。在存在沖突的場景中,Delta Lake 會拋出一個并發修改異常,以便用戶處理它們并重試它們的作業。Delta Lake 還提供了強大的 序列化隔離級別#Serializable),允許工程師不斷地對目錄或表進行寫操作,而用戶可以不斷地從相同的目錄或表中讀取數據。讀取者將看到讀操作開始時存在的最新快照。

模式管理:Delta Lake 會自動驗證正在寫入的 DataFrame 模式是否與表的模式兼容。表中存在但 DataFrame 中不存在的列會被設置為 null。如果 DataFrame 中有額外的列在表中不存在,那么該操作將拋出異常。Delta Lake 具有可以顯式添加新列的 DDL 和自動更新模式的能力。

可伸縮的元數據處理:Delta Lake 將表或目錄的元數據信息存儲在事務日志中,而不是存儲在元存儲(metastore)中。這使得 Delta Lake 能夠在固定的時間內列出大型目錄中的文件,并且在讀取數據時非常高效。

數據版本控制和時間旅行:Delta Lake 允許用戶讀取表或目錄先前的快照。當文件在寫期間被修改時,Delta Lake 將創建文件的新版本并保存舊版本。當用戶希望讀取表或目錄的舊版本時,他們可以向 Apache Spark 的讀操作 API 提供一個時間戳或版本號,Delta Lake 根據事務日志中的信息構建該時間戳或版本的完整快照。這使得用戶可以重新進行試驗并生成報告,如果需要,還可以將表還原為舊版本。

統一的批處理和流接收(streaming sink):除了批處理寫之外,Delta Lake 還可以使用 Apache Spark 的結構化流 作為高效的流接收。再結合 ACID 事務和可伸縮的元數據處理,高效的流接收現在支持許多接近實時的分析用例,而且無需維護復雜的流和批處理管道。

記錄更新和刪除:Delta Lake 將支持合并、更新和刪除 DML 命令。這使得工程師可以輕松地維護和刪除數據湖中的記錄,并簡化他們的變更數據捕獲和 GDPR 用例。由于 Delta Lake 在文件粒度上跟蹤和修改數據,因此,比讀取和覆寫整個分區或表要高效得多。

數據期望:Delta Lake 還將支持一個新的 API,用于設置表或目錄的數據期望。工程師將能夠通過指定布爾條件及調整嚴重程度來處理數據期望。當 Apache Spark 作業寫入表或目錄時,Delta Lake 將自動驗證記錄,當出現違規時,它將根據所預置的嚴重程度處理記錄。

Delta Lake ACID 保證是建立在存儲系統的原子性和持久性基礎之上的。具體來說,該存儲系統需要提供以下特性:

原子可見性:必須有一種方法使文件完全可見或完全不可見。

互斥:只有一個寫入者能夠在最終目的地創建(或重命名)文件。

一致性清單:一旦在目錄中寫入了一個文件,該目錄未來的所有清單都必須返回該文件。

3. Delta Lake

Databricks今年4月份開源了一個令spark社區非常興奮的數據湖項目,項目的最終目標是數據科學和機器學習,實際上是在用spark的思維來處理存儲問題。數據永遠會是混亂的,而沒有并發訪問控制的數據存儲也會給數據帶來混亂,造成臟數據、冗余數據。而Delta Lake的一個目標就是提升數據的價值,解決數據治理問題。

Delta使用的默認格式為Parquet。在Delta Lake中,數據被劃分成了三個邏輯層次:Bronze(底層源數據層)、Silver(初步處理的數據層)、Gold(業務展現數據層)。

Bronze層主要用于存儲原始數據,Delta Lake是一個數據湖引擎,可以支持各種各樣的數據接入,這些數據源可能是Kafka、Spark或者是其他數據湖,這些數據接入Delta Lake之后就存儲在Bronze層,Bronze層可以為HDFS或者是其他云廠商的BlobStore,這也保證了數據湖中數據存儲的可擴展性;

Silver層主要用于存儲初步加工的數據,存儲中間數據主要有兩方面意義,一個意義是為了做數據共享,另一個意義是用這些中間數據來做debug;

Gold層主要給業務層直接使用,這些數據是處理后的可以被ML系統或BI系統使用的有價值的產品。可以使用Spark或者Presto在Gold層上直接做展現,或者在這些數據上做數據挖掘

然而僅僅有這些邏輯抽象是不足以讓Delta Lake脫穎而出的,Delta Lake采用了跟Spark RDD一樣的設計理念,使用快照來記錄我們所有的處理過程,給數據增加了版本控制,如果我們發現有數據計算錯誤需要回溯,只需要重新重放redo log即可。

spark一直在往批流結合的路線演進,當我們的存儲層有了快照系統,存儲層也可以做到批流結合,我們就可以用streaming的方式增量模仿batch作業。

流式處理不等于實時Streaming is not about low latency, streaming is incremental processing of data.And the magic part of streaming is that once you use streaming, you will no longer thinking about what data is new?What data is old?What data is already processed?How do I checkpoint my intermedia results?How do I recover from failures?How do I ensure that processing happens end to end with exactly once sematics.Streaming will think these for you.

4. Delta under the cover

在這里主要介紹Delta三個比較亮眼的設計,具體實現還是建議大家去看代碼。

4.1 Redo Log

Apache Parquet 是 Databricks 的首選格式。它是 Hadoop 生態系統中任何項目都可以使用的一種開源列式存儲格式,而且與選擇哪種數據處理框架無關。因此,Delta Lake 似乎是其所支持的數據存儲格式之上的一層。

Delta Lake在底層存儲的組織形式如下面所示,其中delta log中使用json存儲transaction log,每一個版本的Table就會記錄一個json文件,而數據文件存儲在分區中的parquet文件中

my_table/

|

|-- _delta_log/

| |

| |-- 00000.json

| |-- 00001.json

|

|-- date=2019-01-01/

|

| |-- file-1.parquet

4.2 ACID保證

Atomic 是由底層存儲語義來保證的


4.3 沖突處理

同一個Table的線性也是由底層存儲系統的原語保證的,如果有沖突,那么其中一個應該fail。這里你可能會有疑問,如果每次沖突都讓一方fail的話,那重試代價太大了。

Delta這里使用了Database的一個optimistic conflict rule,這個策略默認認為會成功commit,如果commit失敗,那么就會評估沖突的commit是否會對commit造成影響,如果沒有影響commit會自動重試,而不是直接失敗。



相關:

大白菜燉豆腐時,先炒白菜還是先炒豆腐大白菜燉豆腐其實有竅門,并不是直接一鍋燉了,那樣豆腐都碎成渣了做白菜燉豆腐時,先炒白菜還是先炒豆腐?大白菜燉豆腐的正確做法是,先要把豆腐放油鍋內慢火煎一下,煎到四周定型,盛出備用,這樣豆腐不會散,而..

內蒙古計劃今年底貧困旗縣全部摘帽  新華社呼和浩特10月18日電(記者王靖)記者18日從內蒙古自治區政府獲悉,內蒙古計劃到今年底,剩余20個國家級貧困旗縣全部退出貧困序列,屆時全區57個貧困旗縣將全部實現摘帽。   據介紹,2019年中央、自治區..

江蘇南通偵破涉案金額超2.6億元成品油走私大案  新華社南京10月18日電(記者劉巍巍)南通海關18日通報,該關近期對“海船過駁江船”成品油走私模式收網打擊,偵破一成品油走私大案,共摧毀3個成品油走私團伙,抓獲犯罪嫌疑人93名,查證走私成品油4.32萬余噸,..

相關熱詞搜索:她的睫毛,她穿上公主裝,她說吉他譜,碧螺春產于哪里,碧螺春產于,碧螺春產地

上一篇: 上半年音樂串流軟件銷售額達110億美元,Spotify占比最高
下一篇: “汽車準生證”,特斯拉中國正式獲準生產汽車

140期平特一尾