1. 重點特性
1.1 Spark SQL支持
0.9.0 添加了對使用 Spark SQL 的 DDL/DML 的支持,朝着使所有角色(非工程師、分析師等)更容易訪問和操作 Hudi 邁出了一大步。 用戶現在可以使用 CREATE TABLE....USING HUDI
和 CREATE TABLE .. AS SELECT
語句直接在 Hive 等目錄中創建和管理表。 然后用戶可以使用 INSERT
、UPDATE
、MERGE INTO
和 DELETE
語句來操作數據。 此外,INSERT OVERWRITE
語句可用於覆蓋現有批處理 ETL 管道的表或分區中的現有數據。 有關更多信息,請在此處單擊 SparkSQL 查看文檔。 有關更多實現細節,請參閱 RFC-25。
1.2 Flink集成
- Flink寫入支持
CDC Format
的 MOR 表,打開選項changelog.enabled
時,Hudi 會持久化每條記錄的所有更改標志,使用 Flink 的流讀取器,用戶可以根據這些更改日志進行有狀態的計算。請注意當使用異步壓縮時,所有中間更改都合並為一個(最后一條記錄),僅具有 UPSERT 語義。 - 支持Bulk insert來加載現有表,可以將
write.operation
設置為bulk_insert
來使用。 - Flink支持流式讀取 COW 表。
- 刪除消息默認在流式讀取模式下發出,當
changelog.enabled
為false
時,下游接收DELETE
消息作為帶有空負載的 Hudi 記錄。 - Flink寫入現在可以更新歷史分區,即刪除歷史分區中的舊記錄然后在當前分區插入新記錄,打開
index.global.enabled
使用。 - 通過支持不同的 Hive 版本(1.x、2.x、3.x),大大改善了 Hive 同步。
- Flink 支持純日志追加模式,在這種模式下沒有記錄去重,對於
COW
和MOR
表,每次刷新都直接寫入 parquet,關閉write.insert.deduplicate
以開啟這種模式。
1.3 查詢端改進
- Hudi 現在可以在 Spark 中注冊為數據源表。
- 基於Metadata Table的 Spark 讀取改進。
- 添加了對時間旅行查詢的支持。 請參考時間旅行。
1.4 寫入端改進
-
添加了虛擬鍵支持,用戶可以避免將元字段添加到 Hudi 表並利用現有的字段來填充記錄鍵和分區路徑。 請參考 具體配置來開啟虛擬鍵。
-
Clustering改進
- DeltaStreamer 和 Spark Streaming 都添加了異步Clustering支持。可以在這篇博客文章中找到更多細節。
- 增量讀取也適用於Clustering數據。
- 添加了 HoodieClusteringJob 以作為獨立作業來構建和執行Clustering計划。
- 添加了一個配置(
hoodie.clustering.plan.strategy.daybased.skipfromlatest.partitions
)以在創建Clustering計划時跳過最近的 N 個分區。
-
增強 Bulk_Insert模式(新增行寫入器模式),並缺省打開,用戶可以使用行寫入器模式以獲得更好的性能。
-
在 HiveSyncTool 中添加了對 HMS 的支持。 HMSDDLExecutor 是一個 DDLExecutor 實現,基於使用 HMS 的 HMS apis 直接用於執行所有 DDL 。
-
Spark 引擎中添加了預提交驗證器框架。 用戶可以利用該框架來添加驗證給定提交的文件是否都存在,或是否已經刪除所有無效文件等。
- org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator 可用於驗證提交前后行的數據行相同
- org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator 可用於驗證提交前后的數據行不相同
- org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator 可用於驗證表是否產生特定值
這些可以通過設置
hoodie.precommit.validators=<逗號分隔的驗證器類名稱列表> 來配置
。 用戶還可以通過擴展抽象類SparkPreCommitValidator
並覆蓋此方法來提供自己的實現。 -
用戶可以選擇刪除用於生成分區路徑的字段(
hoodie.datasource.write.drop.partition.columns
),以支持使用BigQuery系統查詢Hudi快照。 -
支持華為雲、百度雲、金山雲對象存儲。
-
添加了對
delete_partition
操作的支持,用戶可以在需要時利用它刪除舊分區。 -
ORC格式支持,現在用戶可以指定存儲格式為ORC,注意現在暫時只支持Spark查詢。
-
Hudi 使用不同類型的可溢出映射,用於內部處理合並(壓縮、更新甚至 MOR 快照查詢)。 在 0.9.0 中,我們添加了對 bitcask默認選項的壓縮支持,並引入了由 RocksDB 支持,它可以在大批量更新或處理大型基本文件時性能更高。
-
增強對未提交的數據的自動清理,該增強在雲存儲上性能更優,具體來說是新增了一種新的標記機制,利用時間線服務器對底層存儲執行集中協調的文件標記批量讀/寫。 你可以使用這個配置來啟用,並在這個博客上了解更多。
1.5 DeltaStreamer改進
- JDBC Source 可以采用提取 SQL 語句並從支持 JDBC 的源中增量獲取數據。 這對於例如從 RDBMS 源讀取數據時很有用。 請注意,這種方法可能需要定期重新引導以確保數據一致性,盡管在基於 CDC 的方法上操作要簡單得多。
- SQLSource 使用 Spark SQL 語句從現有表中提取數據,對於基於 SQL 的簡單回填用例非常有用,例如:過去 N 個月只回填一列。
- S3EventsHoodieIncrSource 和 S3EventsSource 有助於從 S3 讀取數據,可靠且高效地將數據攝取到 Hudi。 現有使用 DFSSource 的方法是使用文件的最后修改時間作為檢查點來拉入新文件,但是如果大量文件具有相同的修改時間,則可能會遇到丟失一些要從源讀取的文件的問題。 這兩個源(S3EventsHoodieIncrSource 和 S3EventsSource)通過利用從源存儲桶訂閱文件事件的 AWS SNS 和 SQS 服務,共同確保將數據從 S3 可靠地攝取到 Hudi。
- 除了使用 DeltaStreamer 使用常規偏移格式(topic_name,partition_num:offset,partition_num:offset,....),我們還為 kafka 源提取數據添加了兩種新格式,即基於時間戳和組消費者偏移量。
- 添加了在 deltastreamer 中使用模式提供程序在模式注冊表提供程序 url 中傳遞基本身份驗證憑據的支持。
hudi-cli
的一些改進,例如SCHEDULE COMPACTION
和RUN COMPACTION
語句,以便輕松在 Hudi 表上調度和運行Compaction、Clustering。
2. 遷移指南
- 如果從 0.5.3 之前的版本遷移,還請檢查下面每個后續版本的升級說明。
- Hudi 在 0.9.0 中添加了更多表屬性,以幫助將現有的 Hudi 表與 spark-sql 結合使用。 為了順利地遷移,這些屬性添加到
hoodie.properties
文件中。 每當 Hudi 使用較新的表版本啟動時,即 2(或從 0.9.0 之前移動到 0.9.0),升級步驟將自動執行。 這個自動升級步驟對於每個 Hudi 表只會發生一次,因為hoodie.table.version
將在升級完成后在屬性文件中更新。 - 同樣如果某些用戶想要將 Hudi 從表版本 2 降級到 1 或從 Hudi 0.9.0 移動到 0.9.0 之前,則添加了用於降級的命令行工具(command -
downgrade
),需要使用0.9.0版本中的hudi-cli
工具。 - 在此版本中我們添加了一個新框架來跟蹤代碼中的配置屬性,不再使用包含屬性名稱和值的字符串變量。 這一舉措有助於我們自動生成配置文檔。雖然我們仍然支持舊的字符串變量,但鼓勵用戶使用新的
ConfigProperty
配置項。在大多數情況下,它就像在相應的替代方法上調用.key()
和.defaultValue()
一樣簡單。 例如RECORDKEY_FIELD_OPT_KEY
可以替換為RECORDKEY_FIELD_NAME.key()
。
3. 感謝
感謝參與0.9.0版本的所有貢獻者,歡迎廣大數據湖愛好者加入Apache Hudi社區,歡迎star & fork https://github.com/apache/hudi
4. 源碼下載
- 源碼下載 : Apache Hudi 0.9.0 Source Release
- Maven倉庫包地址: 地址