資料湖揭祕—Delta Lake
DeltaLake簡介
Delta Lake 是 DataBricks 公司開源的、用於構建湖倉架構的儲存框架。能夠支援 Spark,Flink,Hive,PrestoDB,Trino 等查詢/計算引擎。作為一個開放格式的儲存層,它在提供了批流一體的同時,為湖倉架構提供可靠的,安全的,高效能的保證。
Delta Lake 關鍵特性:
- ACID事務:通過不同等級的隔離策略,Delta Lake 支援多個 pipeline 的併發讀寫;
- 資料版本管理:Delta Lake 通過 Snapshot 等來管理、審計資料及後設資料的版本,並進而支援 time-travel 的方式查詢歷史版本資料或回溯到歷史版本;
- 開原始檔格式:Delta Lake 通過 parquet 格式來儲存資料,以此來實現高效能的壓縮等特性;
- 批流一體:Delta Lake 支援資料的批量和流式讀寫;
- 後設資料演化:Delta Lake 允許使用者合併 schema 或重寫 schema,以適應不同時期資料結構的變更;
-
豐富的DML:Delta Lake 支援 Upsert,Delete 及 Merge 來適應不同場景下使用者的使用需求,比如 CDC 場景;
檔案結構
湖表較於普通 Hive 表一個很大的不同點在於:湖表的後設資料是自管理的,儲存於檔案系統。下圖為 Delta Lake 表的檔案結構。
Delta Lake 的檔案結構主要有兩部分組成:
- _delta_log目錄:儲存 deltalake 表的所有後設資料資訊,其中:
- 每次對錶的操作稱一次 commit,包括資料操作(Insert/Update/Delete/Merge)和後設資料操作(新增新列/修改表配置),每次 commit 都會生成一個新的 json 格式的 log 檔案,記錄本次 commit 對錶產生的行為(action),如新增檔案,刪除檔案,更新後的後設資料資訊等;
- 預設情況下,每10次 commit 會自動合併成一個 parquet 格式的 checkpoint 檔案,用於加速後設資料的解析,及支援定期清理歷史的後設資料檔案;
- 資料目錄/檔案:除 _delta_log 目錄之外的即為實際儲存表資料的檔案;需要注意:
- DeltaLake 對分割槽表的資料組織形式同普通的 Hive 表,分割槽欄位及其對應值作為實際資料路徑的一部分;
- 並非所有可見的資料檔案均為有效的;DeltaLake 是以 snapshot 的形式組織表,最新 snopshot 所對應的有效資料檔案在 _delta_log 後設資料中管理;
後設資料機制
Delta Lake 通過 snapshot 來管理表的多個版本,並且支援對歷史版本的 Time-Travel 查詢。不管是查詢當前最新的 snapshot 還是歷史某版本的 snapshot 資訊,都需要先解析得到對應 snapshot 的後設資料資訊,主要涉及到:
- 當前 DeltaLake 的讀寫版本協議(Protocol);
- 表的欄位資訊和配置資訊(Metadata);
- 有效的資料檔案列表;這一點通過一組新增檔案(AddFile)和刪除檔案(RemoveFile)來描述;
那在載入具體 snopshot 時,為了加速載入流程,先嚐試找到小於或等於該版本的 checkpoint 檔案,然後結合其後直到當前版本的 log 檔案,共同解析得到後設資料資訊。
EMR DeltaLake
阿里雲EMR團隊從19年就開始跟進 DeltaLake 社群,並將其落地在 EMR 的商業產品中的。期間,在迭代功能,優化效能,融合生態,降低易用性,場景落地等方面,不斷打磨升級 DeltaLake,使之更好的融入 EMR 產品,方便客戶使用。
以下表格彙總了 EMR DeltaLake 較開源 DeltaLake(社群1.1.0)對比的主要自研特性。
|
EMR DeltaLake |
功能迭代 |
DML語法增強:
|
後設資料同步 metastore:
| |
自動化湖表管理:
| |
效能優化 |
支援 min-max 統計和 dataskipping; |
支援動態分割槽裁剪(DPP); | |
支援動態檔案裁剪(Runtime Filter); | |
支援自定義的 manifest,加速 Hive/Presto/Trino/Impala 查詢; | |
生態整合 |
支援 Presto/Trino/Impala/阿里雲MaxCompute/阿里雲Hologres查詢; |
支援阿里雲OSS 和 JindoData; | |
與阿里雲DLF 深度整合; | |
場景落地 |
實現緩慢變化維SCD Type2的解決方案; |
實現以 DeltaLake 構建完整增量湖倉架構的 CDC 解決方案; |
特別說明:
DeltaLake1.x 版本僅支援 Spark3,且繫結具體 Spark 版本,導致部分新功能/優化不能在老的版本及 Spark2 上使用,而 EMR DeltaLake 保持 Spark2 的 DeltaLake(0.6)和 Spark3 的 DeltaLake(1.x)的功能特性同步;
與 DLF 的深度整合
DLF(Data Lake Formation)是一款全託管的快速幫助使用者構建雲上資料湖及 LakeHouse 的服務,為客戶提供了統一的後設資料管理、統一的許可權與安全、便捷的資料入湖能力以及一鍵式資料探索能力,無縫對接多種計算引擎,打破資料孤島,洞察業務價值。
EMR DeltaLake 與 DLF 深度整合,使 DeltaLake 表建立寫入後自動完成後設資料同步到 DLF 的 metastore,避免了像開源版本那樣,需要使用者再自行建立 Hive 外表關聯 DeltaLake 表的操作。同步後,使用者可以直接通過 Hive、Presto、Impala,甚至阿里雲MaxCompute 及 Hologres 查詢,無需任何其他額外操作。
同樣 DLF 具備成熟的入湖能力,使用者可以通過產品端的配置將 Mysql、RDS、Kafka 的資料直接同步生成 DeltaLake 表。
在 DLF 的產品側,湖格式 DeltaLake 作為第一公民,DLF 也將在接下來的迭代中針對性的提供易用的視覺化展示,和湖表管理的能力,幫助使用者更好的維護湖表。
G-SCD 解決方案
Slowly Changing Dimension(SCD)即緩慢變化維,被認為是跟蹤維度變化的關鍵ETL任務之一。在數倉場景下,通常使用星型模型來關聯事實表和維度表。如果維度表中的某些維度隨時間更新,那麼如何儲存和管理當前和歷史的維度值呢?是直接忽略,還是直接覆蓋,亦或者其他的處理方式,如永久儲存歷史所有的維度值。根據不同的處理方式,SCD 定義了多種型別,其中 SCD Type2 通過增加新記錄的方式保留所有的歷史值。
在實際的生產環境中,我們可能不需要關注所有的歷史維度值,而關注在固定的時間段內最新的值,比如以天或者小時為粒度,關注在每一天或者小時內某個維度的值。因此實際的場景可以轉化為基於固定粒度(或業務快照)的緩慢變化維( Based-Granularity Slowly Changing Dimension,G-SCD )。
在傳統數倉基於 Hive 表的實現,有幾種方式可選,以下列舉兩個解決方案:
- 流式構建T+1時刻的增量資料表,和離線表的T時刻分割槽資料做合併,生成離線表T+1分割槽。其中T表示粒度或業務快照。不難想象該方案每個分割槽儲存了全量的資料,會造成大量的儲存資源浪費;
- 儲存離線的基礎表,每個業務時刻的增量資料獨立儲存,在查詢資料時合併基礎表和增量表。該方案會降低查詢效率。
通過對 DeltaLake 自身的升級,結合對 SparkSQL,Spark Streaming 的適配,我們實現了 SCD Type2 場景。架構如下:
同樣對接上游的 Kafka 的資料,在 Streaming 端按照配置的業務快照粒度將 Batch資料進行切分,分別 commit,並附帶業務快照的值。DeltaLake 在接收到資料後,儲存當前 snapshot 和業務快照的關係。並在下一個業務快照到達時,對前一個 snapshot 做 savepoint,永久保留該版本。使用者查詢時,通過指定的業務快照的具體值,識別到具體的 snapshot,然後通過 time-travel 的方式實現查詢。
G-SCD on DeltaLake 方案優勢:
- 流批一體:不需要增量表和基礎表兩張表;
- 儲存資源:藉助 Delta Lake 本身的 data versioning 能力,實現增量變化維度的管理,不需要按時間粒度保留歷史全量資料;
- 查詢效能:藉助 Delta Lake 的後設資料 checkpoint,資料的 Optimize、Zorder 及 DataSkipping 的能力,提升查詢效率;
- 保留原實現的 SQL 語句:使用者依然可以像用分割槽實現快照的方式一樣,使用類似的分割槽欄位執行要查詢的業務時間粒度內的快照資料。
CDC 解決方案
在當前的數倉架構下,我們往往將資料分層為 ODS,DWD,DWS,ADS 等方便管理。原始資料如儲存在 Mysql 或者 RDS,我們可以消費其 binlog 資料實現對 ODS 表的增量更新。但,從 ODS 到 DWD,從 DWD 到 DWS 層資料呢?由於 Hive 表本身不具備生成類似 binlog 資料的能力,因此我們無法實現下游各鏈路的增量更新。而讓湖表具備生成類似 binlog 資料的能力,又是構建實時增量數倉的關鍵。
阿里雲EMR 基於 DeltaLake 實現了將其作為 Streaming Source 的 CDC 能力。開啟後,對所有的資料操作將同時生成 ChangeData 並持久化,以便下游 Streaming 讀取;同時支援 SparkSQL 語法查詢。如下圖所示:
ODS 層 Delta 表 user_city_table 接收 Source 資料執行 Merge 操作,同時將變更的資料持久化儲存;DWS 層按 city 聚合的 city_cnt_table 表讀取 user_city_table表的 ChangeData 資料,對 cnt 聚合欄位實現更新。
後續規劃
DeltaLake 作為 EMR 主推的湖格式,得到了很多客戶的信任和選擇,並落地到各自的實際生產環境,對接了多種場景。後續會繼續加強在 DeltaLake 的投入,深度發掘和 DLF 的整合,豐富湖表運維管理能力,降低使用者入湖成本;持續優化讀寫效能,完善與阿里雲大資料體系的生態建設,推進客戶湖倉一體架構的建設。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004426/viewspace-2893394/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Delta Lake 資料湖原理和實戰
- Databricks決定開源其Delta Lake資料湖
- 資料湖表格式比較(Iceberg、Hudi 和 Delta Lake)
- 資料湖倉比較:Apache Hudi、Delta Lake、Apache IcebergApache
- 常見的三大資料湖技術 - Delta、Hudi、Iceberg大資料
- 通過 Apache Zeppelin深入瞭解Delta LakeApache
- 亞馬遜雲科技推出安全資料湖Amazon Security Lake亞馬遜
- 資料庫圈周盤點:達夢擬科創板IPO;Delta Lake 2.0開源資料庫
- React Fiber 資料結構揭祕React資料結構
- [譯]揭祕基本資料型別資料型別
- 深度對比Apache CarbonData、Hudi和Open Delta三大開源資料湖方案Apache
- 關於Delta Lake的ACID事務機制簡介
- 為什麼Databricks Delta Lake表格式開源很重要?
- 消除資料重力,從智慧湖倉(Lake House)讀懂實現資料價值的未來
- 談談如何從資料湖(Data Lake)架構轉向資料網格(Data Mesh)架構架構
- 揭祕Oracle雲(一):建立雲資料庫Oracle資料庫
- 揭祕Oracle雲(二):建立自治雲資料庫Oracle資料庫
- 揭祕並行資料倉儲的成本CF並行
- 資料湖+資料倉儲 = 資料湖庫架構架構
- 資料湖
- 開源 | Service Mesh 資料平面 SOFAMosn 深層揭祕
- 揭祕ThreadLocalthread
- 揭祕instancetype
- 1200伺服器,1000億hits,揭祕新浪資料庫伺服器資料庫
- 大資料揭祕:學歷真的能改變命運?大資料
- 資料揭祕:對不起,運氣比努力更重要
- OPPO雲資料庫訪問服務技術揭祕資料庫
- 資料湖中加熱資料?
- 深度揭祕:大資料時代企業賣技術還是賣資料?大資料
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – MongoDBSpring BootMongoDB
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – MySQLSpring BootMySql
- 滴滴大資料揭祕:高溫天部委加班大比拼大資料
- 資料湖--架構師如何助力“湖加速”?架構
- 使用Data Lake Analytics讀/寫RDS資料
- 揭祕前端儲存前端
- ReactJS底層揭祕ReactJS
- synchronized底層揭祕synchronized
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – MyBatis整合Spring BootMyBatis