1. 程式人生 > 其它 >深度解析資料湖儲存方案Lakehouse架構

深度解析資料湖儲存方案Lakehouse架構

簡介:從資料倉庫、資料湖的優劣勢,湖倉一體架構的應用和優勢等多方面深度解析Lakehouse架構。

作者:張泊

Databricks 軟體工程師

Lakehouse由lake和house兩個詞組合而成,其中lake代表Delta Lake(資料湖),house代表data warehouse(資料倉庫)。因此,Lakehouse架構就是資料湖和資料倉庫的結合。資料倉庫和資料湖各自都存在著很多不足,而Lakehouse的出現綜合了兩者的優勢,彌補了它們的不足。

資料倉庫從上世紀 80 年代開始發展和興起,它的初衷是為了支援BI系統和報表系統,而它的優勢也就在於此。結構化的資料可以通過ETL來匯入資料倉庫,使用者可以方便地接入報表系統以及BI系統。同時,它的資料管控能力也比較強。

資料倉庫對於資料 schema 的要求非常嚴格,很多資料倉庫甚至也實現了 acid 事務等能力。但是資料倉庫對於半結構化資料比如時序資料和日誌,以及非結構化資料比如圖片、文件等的支援是非常有限的,因此它不適用於類似於機器學習的應用場景。而且一般情況下,資料倉庫都是專有系統,使用成本比較高,資料遷移和同步的靈活性比較低。

因此,為了解決上述問題,資料湖的架構應運而生。

資料湖架構的基礎是將原始資料以檔案的形式儲存在像阿里雲OSS、AWS S3 和 Azure blob storage 等物件儲存系統上。相比於資料倉庫使用的專有系統,使用這些物件儲存的成本比較低。資料湖的另一個優勢是能夠對半結構化和非結構化的資料提供非常好的支援。因為資料可以以檔案的形式直接儲存在資料湖之中,所以資料湖在機器學習等場景中的應用就比較廣泛。但是它對於 BI 和報表系統的支援比較差,通常情況下需要通過ETL將資料轉存到實時資料庫或資料倉庫中,才能支援 BI 和報表系統,而這對於資料的實時性和可靠性都會產生負面的影響。

綜上,不論是資料倉庫還是資料湖,都無法完全滿足使用者的需求。

因此,在很多實際使用場景中,使用者會將兩者組合起來使用,但是這導致需要構建很多不同的技術棧來支援所有場景。

比如對於資料分析,需要將結構化的資料輸入到資料倉庫,然後建立資料市場,對資料分析和 BI 提供支援;對於資料科學和機器學習的場景,需要把不同的資料比如結構化、半結構化以及非結構化的資料儲存到資料湖中,經過資料清理,用來支援機器學習和資料科學等場景;而對於流式資料來源,需要通過流式資料引擎儲存到實時資料庫中,同時還需要對資料湖裡的資料進行 ETL 提取、轉換和載入,來保證資料的質量。

這導致需要很多不同的系統、不同的工具來支援各種架構,同時為了資料的互通(上圖紅線),還需要處理不同的專有資料格式之間的差異,以上流程都會大大影響整個系統的效率。

而且,由於所有技術棧都是互相獨立的,導致了維護和使用這些系統的團隊也是分散的。比如,資料分析師主要使用資料倉庫系統,而資料科學家主要使用資料湖系統,同時資料工程師也需要維護整個系統的不同團隊,溝通成本比較高。此外,系統中維護了很多不同格式的資料副本,沒有統一的管理資料模型,不同團隊的資料很有可能會產生差異。

因此,這種複雜的組合型資料系統不是一個好的解決方案。基於此,databricks提出了Lakehouse。Lakehouse的設計基於一個原則:實現一個適用於所有場景的統一平臺。

解決的辦法是綜合資料湖與資料倉庫的能力——基於資料湖使用的物件儲存,構建資料倉庫擁有的資料管控能力。而這一切的關鍵就是其中的結構化事務層。

此前,資料湖主要存在以下幾個痛點:
  1. 讀寫並行,就算是追加寫的模式也會產生很多問題。使用者的期望是所有寫操作能夠事務性地被同時讀到或者同時沒有讀到,而這是難以實現的,因為在分散式的物件儲存上寫多個檔案,設定一個檔案,資料的一致性都是不能完全被保證的。
  2. 資料的修改。由於安全合規等原因,使用者會有強制性地修改已有資料的需求,特別是有時候需要根據過濾結果細粒度地修改某些資料。由於資料湖在資料管控能力上的不足,在資料湖上實現此需求往往需要使用全部掃描再重寫的方式,成本比較高,速度也比較慢。
  3. 如果一個作業中途失敗,而它產生的部分資料已經存入到資料庫中,這也會導致資料的損壞。
  4. 批流混合輸入。由於資料在批和流系統中都存在,可能會造成資料在兩套系統中不一致,導致讀取結果不一致。
  5. 存資料歷史。有些使用者需要保證資料查詢的可重複性,方案之一是為了這個需求做很多重複的資料快照,但這會導致資料的儲存和計算成本都大幅上升。
  6. 處理海量的元資料。大型資料湖元資料的資料量非常大,經常能夠達到大資料的級別。很多資料湖採用的資料目錄系統無法支援如此大量的元資料,這也限制了資料湖的擴充套件性。
  7. 大量小檔案的問題。在資料不斷輸入的過程中,資料湖內會產生大量小檔案,隨著時間的推移,小檔案的數量可能會越來越多,這會嚴重影響資料湖的讀取效能。
  8. 效能問題。在資料湖上達到高效能不是一件容易的事。有的時候為了達到一定的效能要求,使用者需要手動做一些效能的優化,比如資料分割槽等,而這些手動的操作又比較容易出錯。
  9. 資料的查詢管控。由於資料湖的開放性,確保查詢許可權合規也是需要解決的問題。
  10. 質量問題。前面很多點都會導致資料質量的問題。在大資料場景下,如何確保資料的正確性也是一個普遍的問題。

而Delta Lake能夠為Lakehouse帶來資料質量、可靠性以及查詢效能的提升。

上述前五個問題都是關於資料可靠性,它們都可以通過Delta Lake的 acid 事務能力來解決。在Delta Lake上,每一個操作都是事務的,即每一個操作都是一個整體,要麼整體成功,要麼整體失敗。如果 一個操作在中途失敗,Delta Lake會負責將其寫入的不完整資料清理乾淨。具體的實現方式是Delta Lake維護了包含所有操作的一個事務日誌,能夠保證資料與事務日誌的一致性。

如上圖,某次寫操作在某個表中添加了很多資料,這些資料被轉換成了parquet格式的兩個檔案file1和file2。有了事務日誌,讀操作的時候就能夠保證要麼讀不到這條日誌,要麼同時讀到這兩條記錄,這樣就保證了讀取的一致性,解決了讀寫並行的問題。

此外,有了事務日誌後也可以對已有資料做細粒度的修改。比如下一次寫操作對錶中的某些資料進行修改,在事務日誌中就會出現刪除原有檔案file1和新增修改後檔案file3這樣兩條記錄。同樣,在讀取的時候,這兩條記錄也會被同時讀到或者忽略,使讀取的一致性得到保證。

針對第三點中途失敗的作業,Delta Lake寫入的事務效能夠保證不完整的資料不會被成功寫入。

對於批流混合的輸入資料,由於Spark天然支援批流一體,在寫入時可以將批和流的資料寫入到同一張表,避免了資料冗餘及不一致性。

由於事務日誌儲存了所有操作的歷史記錄,我們可以對之前某個時間點的歷史資料進行查詢。具體實現方法是:Delta Lake可以查到歷史某個時間點對應的事務日誌,並且根據歷史的事務日誌進行資料重放,得到該時間點的資料狀態。這個能力被稱為“時間旅行”。

那麼,Delta Lake是怎樣處理海量元資料的呢?答案很簡單,使用 Spark 來處理。所有Delta Lake的元資料均以開源parquet的格式儲存,資料與元資料總是相伴相生,無需進行同步。使用 Spark 處理元資料,使得Delta Lake的元資料可以在理論上進行無限的擴充套件。

Delta Lake還採用索引的機制來優化效能,它採用分割槽和不同過濾器等的機制,可以跳過資料的掃描。還採用了Z-ordering的機制,可以在對某個列進行優化的同時,使其他列效能犧牲最小化。

為了解決大量小檔案的問題,Delta Lake還可以在後臺定期對資料佈局進行自動優化。如果儲存的小檔案過多,會自動的將他們合併成大檔案,這解決了資料湖中小檔案越來越多的問題。

對於資料查詢的管控,Delta Lake實現了表級別的許可權控制,也提供了許可權設定 API,可以根據使用者的許可權動態對檢視進行脫敏。

最後,Delta Lake實現了schema的驗證功能來保證資料質量。存在Delta Lake表中的所有資料都必須嚴格符合其對應的schema,它還支援在資料寫入時做schema 的合併演化。當輸入資料的 schema 發生變化的時候,Delta Lake可以自動對錶的schema進行相應的演化。

總的來說,Delta Lake是在資料湖儲存之上,實現了資料倉庫擁有的ACID事務特性、高效能資料治理能力以及資料質量保證。同時它是基於開放的儲存格式,其本身也是開源的。此外,Delta Lake在架構設計上採用了多層的資料模型來簡化設計,一層層逐步提高資料質量。

剛剛進入Delta Lake的資料表,完全對應著資料的原始輸入,資料質量比較低的,被稱為Bronze表。Bronze表的資料保留也可以設定得長一些,以便從這些表中回溯歷史資料。Bronze表中的資料經過過濾清理,就可以得到下一層的Silver表,可以使其與其他表或者維度表進行創意操作,進行資料的擴充套件。再往下一層,可以根據業務的需求對已經清理過濾好的資料進行聚合,得到Gold表,可以直接支援業務分析、報表等應用。

可以看到,在Delta Lake架構中,資料質量是在不斷提升的。相比於lambda 架構,它的設計優勢在於在每一層都可以使用PDO統一的資料管道,以事務性的操作對錶進行更新,還可以減少資料冗餘,從而優化儲存和計算的開銷。

總體而言,Lakehouse的架構優勢有以下幾個方面:

  1. Delta Lake的計算和儲存天然分離,使用者可以進行更靈活的資源排程。
  2. Lakehouse依賴於可以無限擴容的物件儲存服務,其元資料的處理也依賴於高擴充套件性的 Spark 作業,使用者無須關心儲存容量的問題。
  3. 開放的資料格式可以讓資料在不同系統之間的遷移更加順暢。
  4. 與資料湖相同,Lakehouse同時支援結構化、半結構化與非結構化的資料。
  5. 批流一體。與 lambda 架構不同,Lakehouse能夠做到真正的批流一體,從而簡化資料的架構。

Databricks公司與阿里雲聯手打造了全新的產品 databricks 資料洞察,簡稱DDI。

Databricks 獨家優化了databricks runtime引擎,也可以理解為Apache Spark的加強版,它與Delta Lake 融合進阿里雲的整套生態系統中,與ECS、OSS、JindoFS進行了很好的結合,提供了全託管高效能的企業級 Spark平臺,能夠同時支援企業的商業洞察分析以及機器學習訓練等。

原文連結

本文為阿里雲原創內容,未經允許不得轉載。