Apache Iceberg 是一種現代表格式,旨在克服傳統 Hive 表的侷限性,提供更高的效能、一致性和可擴充套件性。在本文中,我們將探討 Iceberg 的演變、其關鍵功能(如 ACID 事務、分割槽演變和時間旅行)以及它如何與現代資料湖整合。我們還將深入探討其架構、後設資料管理和目錄系統,並將其與其他表格式(如 Delta Lake 和 Parquet)進行比較。最後,您將清楚地瞭解 Apache Iceberg 如何增強大規模資料管理和分析。
學習目標
- 瞭解 Apache Iceberg 的主要功能和架構。
- 瞭解 Iceberg 如何在不重寫資料的情況下實現模式和分割槽的演進。
- 探索 ACID 事務和時間旅行如何提高資料一致性。
- 比較 Iceberg 與其他表格式(如 Delta Lake 和 Hudi)。
- 探索 Apache Iceberg 提高資料湖效能的用例。
Apache Iceberg簡介
Apache Iceberg 是由 Netflix 的 Ryan Blue 和 Daniel Weeks 於 2017 年開發的一種表格式,旨在解決與 Hive 表格式相關的效能瓶頸、一致性問題和侷限性。2018 年,該專案開源並捐贈給 Apache 軟體基金會,吸引了蘋果、Dremio、AWS、騰訊、LinkedIn 和 Stripe 等大公司的貢獻。隨著時間的推移,更多的組織也加入了支援和增強該專案的行列。
Source: Apache Iceberg: The Definitive Guide
Apache Iceberg的演變
Netflix 發現了 Hive 表格式中的一個基本缺陷:表使用目錄和子目錄進行跟蹤,這限制了保持一致性、提高併發性和支援資料倉儲中常見功能所需的粒度水平。為了克服這些限制,Netflix 開始開發一種新的表格格式,並確定了幾個關鍵目標:
一致性
當更新跨越多個分割槽時,使用者絕不會遇到資料不一致的情況。更改應原子式快速應用,確保使用者在更新前或更新後都能看到資料,但絕不會處於中間狀態。
效能
Hive 對檔案和目錄列表的依賴造成了查詢規劃瓶頸。新格式需要提供高效的後設資料處理,減少不必要的檔案掃描,提高查詢執行速度。
易用性
使用者無需瞭解表的物理結構,就能從分割槽中獲益。系統應自動最佳化查詢,而無需對派生分割槽列進行額外過濾。
可發展性
Hive 中的模式修改經常會導致不安全的事務,而更改表的分割槽則需要重寫整個資料集。新格式必須允許安全的模式和分割槽更新,而不需要重寫整個表。
可擴充套件性
所有這些改進都必須在 Netflix 的龐大規模上執行,高效處理 PB 級的資料。
Iceberg格式介紹
為了應對這些挑戰,Netflix 設計了 Iceberg,以檔案而不是目錄的規範列表來跟蹤表。Apache Iceberg 是一種標準化的表格格式,它定義了後設資料在多個檔案中的結構。為了推動採用,該專案提供了與 Apache Spark 和 Apache Flink 等流行計算引擎整合的庫。
Data Lakes的標準
Apache Iceberg 可與現有的儲存解決方案和計算引擎無縫整合,使工具無需進行重大改動即可採用該標準。我們的目標是讓 Iceberg 成為無處不在的行業標準,使使用者能夠與表格進行互動,而不必擔心底層格式。
現在,許多資料工具都提供對 Iceberg 的本地支援,使使用者在不知不覺中就能使用 Iceberg 表格。隨著時間的推移,隨著自動錶最佳化和攝取工具的發展,即使是資料工程師也能像使用傳統資料倉儲一樣輕鬆地與資料湖儲存互動,而無需手動管理儲存層。
Apache Iceberg的主要功能
Apache Iceberg 不僅僅是為了解決 Hive 表格式的侷限性,它還引入了強大的功能,以增強資料湖和資料湖居工作負載。以下是其主要功能概述:
ACID事務
Apache Iceberg 使用樂觀併發控制提供 ACID 保證,確保事務要麼完全提交,要麼完全回滾。與可能造成瓶頸的傳統悲觀鎖定不同,Iceberg 的方法在保持一致性的同時最大限度地減少衝突。目錄在管理這些事務中起著至關重要的作用,可防止可能導致資料丟失的衝突更新。
分割槽演變
傳統資料湖的挑戰之一是無法在不重寫整個表的情況下修改分割槽。Iceberg 透過啟用分割槽演進解決了這一問題,允許更改分割槽方案,而不需要昂貴的表重寫。新資料可使用更新的分割槽策略寫入,而舊資料保持不變,確保無縫最佳化。
Source: Apache Iceberg: The Definitive Guide
隱藏分割槽
使用者通常不需要知道表是如何物理分割槽的。Iceberg 引入了一種更直觀的方法,允許查詢自動受益於分割槽。Iceberg 不要求使用者透過派生的分割槽列進行過濾(例如,查詢時間戳時透過 event_day 進行過濾),而是應用諸如 bucket、截斷、年、月、日和小時等轉換,確保無需人工干預即可高效執行查詢。
Source: Apache Iceberg: The Definitive Guide
行級表操作
Iceberg 支援兩種行級更新策略:
- 寫入時複製(COW):當更新一行時,整個資料檔案將被重寫,以確保較強的一致性。
- 讀取時合併(MOR):只有修改過的記錄才會寫入新檔案,並且在查詢執行過程中對更改進行調節,從而最佳化了頻繁更新和刪除的工作負載。
時間旅行
Iceberg 維護不可變的資料快照,實現時間旅行查詢。該功能允許使用者分析歷史表狀態,使其在審計、重現機器學習模型輸出或檢索特定時間點出現的資料時非常有用,而無需單獨的資料副本。
Source: Apache Iceberg: The Definitive Guide
版本回滾
除了查詢歷史資料,Iceberg 還允許將表回滾到之前的快照。這對於撤銷意外修改或將資料恢復到已知良好狀態特別有用。
Source: Apache Iceberg: The Definitive Guide
模式演變
隨著時間的推移,表自然會發生演變,需要新增或刪除列、重新命名欄位或修改資料型別等更改。Iceberg 支援模式演進,無需重寫表,確保靈活性的同時保持與現有資料的相容性。
憑藉這些功能,Apache Iceberg 正在透過提供強大、可擴充套件和使用者友好的表管理功能,塑造資料湖的未來。
Apache Iceberg的架構
在本節中,我們將討論 Apache Iceberg 的架構,以及 Apache Iceberg 如何解決 Hive 表格式中固有的問題。我們將能夠了解到引擎蓋下的最佳架構。
Source: Apache Iceberg: The Definitive Guide
資料層
Apache Iceberg 表的資料層負責儲存實際的表資料。它主要由資料檔案組成,但也包括標記為刪除的記錄的刪除檔案。這一層對於提供查詢結果至關重要,因為它提供了處理所需的底層資料。雖然某些查詢只需使用後設資料就能回答,例如檢索列的最大值,但資料層通常參與完成大多數使用者查詢。從結構上看,該層中的檔案構成了 Apache Iceberg 樹狀架構的葉子。
在實際應用中,資料層託管在分散式檔案系統(如 Hadoop 分散式檔案系統(HDFS))或物件儲存系統(如亞馬遜 S3、Azure 資料湖儲存(ADLS)或谷歌雲端儲存(GCS))上。這種靈活性使 Apache Iceberg 能夠與現代資料湖架構無縫整合,從而實現大規模高效資料管理和分析。
資料檔案
資料檔案儲存 Apache Iceberg 表中的實際資料。Iceberg 與檔案格式無關,支援 Apache Parquet、ORC 和 Avro,這提供了關鍵優勢:
- 企業可根據歷史或操作需要維護多種檔案格式。
- 工作負載可以使用最合適的格式(例如,Apache Parquet、ORC 和 Avro)、
- 面向未來,隨著技術的發展,可輕鬆採用新格式。
Source: Apache Iceberg: The Definitive Guide
儘管有這樣的靈活性,Parquet 仍然是使用最廣泛的格式,因為它的列式儲存可以最佳化現代分析引擎的查詢效能、壓縮和並行性。
刪除檔案
由於資料湖儲存是不可變的,因此不可能直接更新行。相反,刪除檔案可以跟蹤刪除的記錄,從而實現讀取時合併(MOR)更新。有兩種型別:
位置刪除:根據檔案路徑和行位置識別記錄(例如,刪除檔案中第 234 行的記錄)。
Source: Apache Iceberg: The Definitive Guide
等價刪除:根據特定列值識別記錄(例如,刪除 order_id = 1234 的所有記錄)。
Source: Apache Iceberg: The Definitive Guide
刪除檔案僅適用於 Iceberg v2 表,確保查詢引擎使用序列號正確應用更新,防止在插入新資料時意外刪除行。
Apache Iceberg中的後設資料層
後設資料層是 Iceberg 表架構的重要組成部分,負責管理所有後設資料檔案。它採用樹形結構,既跟蹤資料檔案,也跟蹤建立這些檔案的操作。
Iceberg中的關鍵後設資料元件
- Manifest Files
- 跟蹤資料檔案,並在細粒度級別刪除檔案。
- 包含列值範圍等統計資訊,有助於查詢剪枝。
- 以Avro格式編寫,儲存效率高。
- Manifest Lists
- 代表特定時間的錶快照。
- 儲存清單檔案的後設資料,包括分割槽詳情和行數。
- 幫助 Iceberg 維護時間旅行功能,以查詢歷史狀態。
- Metadata Files
- 跟蹤全表資訊,如模式、分割槽規格和快照。
- 確保原子更新,防止併發寫入時出現不一致。
- 維護歷史更改日誌,以支援模式演進。
- Puffin Files
- 儲存高階統計資料和索引,如 Apache DataSketches 的 Theta sketches。
- 最佳化需要近似不同計數的查詢(如每個地區的唯一使用者)。
- 提高分析查詢的效能,而無需全表掃描。
透過有效組織這些後設資料檔案,Iceberg 實現了時間旅行(查詢歷史資料狀態)和模式演進(修改表模式而不中斷現有查詢)等關鍵功能。這種結構化方法使 Iceberg 成為管理大規模資料集的強大解決方案。
Apache Iceberg中的目錄
當讀取一個表或管理成百上千個表時,使用者需要一種方法來找到正確的後設資料檔案,告訴他們在哪裡讀取或寫入資料。Iceberg 目錄就是這樣一箇中央登錄檔,幫助使用者和系統確定任何給定表的當前後設資料檔案位置。
Iceberg目錄的作用
目錄的主要功能是為每個表儲存一個指向當前後設資料檔案的指標。這個後設資料指標至關重要,因為它能確保所有讀寫器在任何給定時間都與相同的表狀態互動。目錄主要為每個表儲存一個指向當前後設資料檔案的指標。這個後設資料指標可確保所有讀寫器在任何給定時間內與相同的表狀態互動。
Iceberg目錄如何儲存後設資料指標?
不同的後端系統都可以作為 Iceberg 目錄,各自以自己的方式處理後設資料指標:
- Hadoop 目錄(亞馬遜 S3 示例)
- 在表的後設資料資料夾中使用名為 version-hint.text 的檔案。
- 該檔案包含最新後設資料檔案的版本號。
- 由於這種方法依賴於分散式檔案系統(或類似的抽象),因此被稱為Hadoop 目錄。
- Hive Metastore 目錄
- 在名為 location 的表屬性中儲存後設資料檔案位置。
- 常用於基於 Hive 的資料生態系統。
- Nessie 目錄
- 在名為 metadataLocation 的表屬性中儲存後設資料檔案位置。
- 適用於版本控制的資料湖實施。
- AWS Glue 目錄
- 功能與 Hive 元儲存類似,但完全由 AWS 管理。
Apache Iceberg與其他表格式的比較
在資料湖中處理大規模資料時,選擇正確的檔案或表格式對效能、一致性和可擴充套件性至關重要。Apache Iceberg、Apache Parquet、Apache ORC 和 Delta Lake 被廣泛使用,但它們的用途各不相同。
每種格式概述
格式 | 型別 | 關鍵特徵 | 最佳用例 |
Apache Iceberg | 表格式 | ACID 事務、時間旅行、模式演進 | 大規模分析、基於雲的資料湖 |
Apache Parquet | 檔案格式 | 列式儲存、壓縮 | 最佳化查詢、分析 |
Apache ORC | 檔案格式 | 列式儲存、輕量級索引 | 基於蜂巢的工作負載、大資料處 |
Delta Lake | 表格式 | ACID 事務、版本管理 | 流式+批處理工作負載、即時管道 |
Apache Iceberg 作為一種現代表格式,可實現大規模資料湖的 ACID 事務、模式演進、分割槽演進和時間旅行。與 Parquet 和 ORC 相比,Iceberg 不僅僅是一種檔案格式,它還提供事務保證和後設資料最佳化。雖然 Delta Lake 也支援 ACID 事務,但 Iceberg 在模式和分割槽演化方面更具優勢,是長期雲原生資料湖儲存的有力選擇。
另請閱讀:Apache Arrow 入門
小結
Apache Iceberg 是一種功能強大的表格式,旨在克服 Hive 表格式的侷限性,提供更好的一致性、效能、可擴充套件性和易用性。其創新功能,如 ACID 事務、分割槽演化、時間旅行和模式演化,使其成為管理大規模資料湖的企業的不二之選。透過與現有儲存解決方案和計算引擎的無縫整合,Iceberg 為資料湖管理提供了一種靈活且面向未來的方法。
常見問題
Q1. 什麼是 Apache Iceberg?
A. Apache Iceberg 作為一種開源表格式,可提高資料湖的效能、一致性和可擴充套件性。
Q2. Apache Iceberg 的需求是什麼?
A. 開發人員建立了 Apache Iceberg,以克服 Hive 表格式的侷限性,例如低效的後設資料處理和缺乏原子事務。
Q3. Apache Iceberg 如何處理模式演化?
A. Iceberg 支援模式變更,如新增、重新命名或刪除列,而無需重寫整個表。
Q4. Apache Iceberg 中的分割槽演化是什麼?
A. 分割槽演進允許修改分割槽方案,而無需重寫歷史資料,從而實現更好的查詢最佳化。
Q5. Iceberg 如何支援 ACID 事務?
A. 它使用樂觀併發控制來確保原子更新並防止併發寫入中的衝突。
評論留言