本文翻譯自 Databricks 官方博客
我們很高興地宣布將 Delta Lake 項(xiàng)目開源。 Delta Lake 是一個(gè)存儲(chǔ)層丧枪,通過在寫入和快照隔離之間提供樂觀并發(fā)控制實(shí)現(xiàn) ACID 事務(wù),保證了在寫入期間讀取的一致性运挫,從而為構(gòu)建在 HDFS 和云存儲(chǔ)上的數(shù)據(jù)湖泊帶來可靠性保障旗们。 Delta Lake 還提供內(nèi)置數(shù)據(jù)版本控制,以便輕松回滾和復(fù)制報(bào)告蔓涧。該項(xiàng)目可在 delta.io 下載件已。該項(xiàng)目使用 Apache License 2.0 協(xié)議。
數(shù)據(jù)湖泊面臨的挑戰(zhàn)
數(shù)據(jù)湖泊是現(xiàn)代數(shù)據(jù)架構(gòu)中的常見元素元暴。企業(yè)在不斷進(jìn)行收集和挖掘海量數(shù)據(jù)時(shí)篷扩,數(shù)據(jù)湖泊可以作為中央存儲(chǔ)。然而茉盏,雖然目前的數(shù)據(jù)湖泊在數(shù)據(jù)治理方面邁出了一大步瞻惋,但它們遇到了以下常見問題:
- 讀取和寫入數(shù)據(jù)湖泊是不可靠的厦滤。數(shù)據(jù)工程師經(jīng)常遇到不安全寫入數(shù)據(jù)湖并導(dǎo)致讀者在寫入期間看到垃圾數(shù)據(jù)的問題。他們必須構(gòu)建變通方法以確保讀者在寫入期間始終看到一致的數(shù)據(jù)歼狼。
- 數(shù)據(jù)湖泊中的數(shù)據(jù)質(zhì)量很低掏导。將非結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)儲(chǔ)到數(shù)據(jù)湖泊中很容易,但這是以數(shù)據(jù)質(zhì)量為代價(jià)的羽峰。沒有任何驗(yàn)證 Schema 和數(shù)據(jù)的機(jī)制的話趟咆,數(shù)據(jù)湖泊的數(shù)據(jù)質(zhì)量將會(huì)變得很差,以至于努力挖掘這些數(shù)據(jù)的分析項(xiàng)目也會(huì)失敗梅屉。
- 隨著數(shù)據(jù)量的增加值纱,性能越來越差。隨著轉(zhuǎn)儲(chǔ)到數(shù)據(jù)湖泊中的數(shù)據(jù)量的增加坯汤,文件和目錄的數(shù)量也會(huì)增加虐唠。處理數(shù)據(jù)的大數(shù)據(jù)作業(yè)和查詢引擎在處理元數(shù)據(jù)操作上就會(huì)花費(fèi)大量時(shí)間;在執(zhí)行流式作業(yè)時(shí)惰聂,這個(gè)問題會(huì)更加明顯疆偿。
-
更新數(shù)據(jù)湖泊中的記錄很難。工程師需要構(gòu)建復(fù)雜的處理作業(yè)來讀取整個(gè)分區(qū)或表搓幌,修改數(shù)據(jù)并將其寫回杆故,這種作業(yè)效率低且難以維護(hù)。
由于存在這些挑戰(zhàn)溉愁,許多大數(shù)據(jù)項(xiàng)目無(wú)法實(shí)現(xiàn)其愿景处铛,有時(shí)甚至?xí)耆 N覀冃枰环N解決方案拐揭,使數(shù)據(jù)從業(yè)者在能夠利用他們現(xiàn)有的數(shù)據(jù)湖泊的同時(shí)確保數(shù)據(jù)質(zhì)量撤蟆。
Delta Lake 開源項(xiàng)目介紹
Delta Lake 解決了上述問題,能簡(jiǎn)化您構(gòu)建數(shù)據(jù)湖泊的方式堂污。它提供以下主要功能:
- ACID 事務(wù):Delta Lake 提供多次寫入之間的 ACID 事務(wù)家肯。每次寫入都是一個(gè)事務(wù),并且在事務(wù)日志中順序記錄了寫入的序列敷鸦。事務(wù)日志跟蹤文件級(jí)別的寫入并使用樂觀并發(fā)控制息楔,這非常適合數(shù)據(jù)湖泊,因?yàn)椴粫?huì)經(jīng)常發(fā)生多個(gè)寫入嘗試修改相同的文件的情況扒披。在存在沖突的情況下值依,Delta Lake 會(huì)拋出并發(fā)修改異常以遍用戶處理并重試其作業(yè)。 Delta Lake 還提供強(qiáng)大的可序列化隔離級(jí)別碟案,允許工程師持續(xù)寫入一個(gè)目錄或表愿险,并允許消費(fèi)者持續(xù)從同一目錄或表中進(jìn)行讀取。讀取者將會(huì)看到開始讀取時(shí)存在的最新快照。
- Schema 管理:Delta Lake 自動(dòng)驗(yàn)證正在寫入的 DataFrame 的 Schema 是否與表的 Schema 兼容辆亏。表中存在但不在 DataFrame 中的列設(shè)置為 null风秤。如果 DataFrame 中有 Schema 中沒有定義的列,則此操作會(huì)引發(fā)異常扮叨。 Delta Lake 具有顯式添加新列的 DDL 以及自動(dòng)更新 Schema 的能力缤弦。
- 可擴(kuò)展的元數(shù)據(jù)處理:Delta Lake 將表或目錄的元數(shù)據(jù)信息存儲(chǔ)在事務(wù)日志中,而不是 Metastore 中彻磁,這允許Delta Lake在恒定時(shí)間內(nèi)列出大型目錄中的文件碍沐,并在讀取數(shù)據(jù)時(shí)更高效。
- 數(shù)據(jù)版本控制和時(shí)間旅行:Delta Lake 允許用戶讀取表或目錄的歷史快照衷蜓。在寫入或者修改文件時(shí)累提,Delta Lake會(huì)創(chuàng)建較新版本的文件并保留舊版本。當(dāng)用戶想要讀取舊版本的表或目錄時(shí)磁浇,他們可以為 Apache Spark 的讀取 API 提供時(shí)間戳或版本號(hào)斋陪,Delta Lake 根據(jù)事務(wù)日志中的信息構(gòu)建該時(shí)間戳或版本的完整快照。這允許用戶重現(xiàn)實(shí)驗(yàn)和報(bào)告置吓,并在需要時(shí)將表還原為舊版本无虚。
- 統(tǒng)一批處理和流式處理:除了批量寫入,Delta Lake 還可以用作 Apache Spark Structured Streaming 的高效流式接收器交洗。結(jié)合 ACID 事務(wù)和可擴(kuò)展的元數(shù)據(jù)處理骑科,高效的流式傳輸接收器現(xiàn)在可以實(shí)現(xiàn)大量近實(shí)時(shí)分析用例橡淑,而無(wú)需維護(hù)復(fù)雜的流式傳輸和批處理管道构拳。
- 記錄更新和刪除(即將發(fā)布):Delta Lake 提供合并、更新和刪除這些 DML 命令梁棠。這允許工程師很方便的對(duì)數(shù)據(jù)進(jìn)行修改和刪除置森,簡(jiǎn)化數(shù)據(jù)變更捕獲以及 GDPR。因?yàn)?Delta Lake 按文件粒度跟蹤數(shù)據(jù)變更符糊,所以比一次處理所有分區(qū)或表要高效的多凫海。
- 數(shù)據(jù)期望(即將推出):Delta Lake 還將支持新的 API 來設(shè)置表或目錄的數(shù)據(jù)期望。工程師將能夠指定布爾條件并調(diào)整嚴(yán)重程度以處理數(shù)據(jù)期望男娄。當(dāng) Apache Spark 作業(yè)寫入表或目錄時(shí)行贪,Delta Lake 將自動(dòng)驗(yàn)證記錄,當(dāng)存在違規(guī)時(shí)模闲,它將根據(jù)提供的嚴(yán)重程度配置對(duì)記錄進(jìn)行處理建瘫。
結(jié)論
Apache Spark 在大數(shù)據(jù)處理領(lǐng)域進(jìn)行了變革,并允許工程師構(gòu)建高效的數(shù)據(jù)管道尸折。但是啰脚,我們發(fā)現(xiàn)工程師在如何管理存儲(chǔ)層(內(nèi)部部署和云端)方面存在重大差距。他們不得不通過變通方法構(gòu)建復(fù)雜的數(shù)據(jù)管道來向消費(fèi)者提供數(shù)據(jù)实夹。隨著 Delta Lake 的出現(xiàn)橄浓,我們看到 Databricks 的客戶可以毫不費(fèi)力地建立可靠的數(shù)據(jù)湖泊×C危現(xiàn)在我們正在為更廣泛的社區(qū)開放 Delta Lake 項(xiàng)目,以便讓社區(qū)獲益荸实。