close

在發布的Apache Hudi 0.10.0版本中共解決了388個issue,包括眾多重磅特性支持以及Bug修復。

1. 重點特性1.1 Kafka Connect(Kafka連接器)

在0.10.0 中我們為 Hudi 添加了一個Kafka Connect Sink,為用戶提供了從 Apache Kafka 直接向 Hudi 表攝取/流式傳輸記錄的能力。雖然用戶已經可以使用 Deltastreamer/Spark/Flink 將 Kafka 記錄流式傳輸到 Hudi 表中,但 Kafka Connect Sink為當前用戶提供了好的靈活性,如果不部署和運維Spark/Flink的用戶,也可以通過Kafka Connect Sink將他們的數據寫入數據湖。Kafka Connect目前處於實驗階段,用戶可以參考README-Hudi-Kafka-Connect[1]的詳細步驟快速上手,對內部實現感興趣的用戶可以參考RFC-32_Kafka Connect Sink For Hudi[2]。除了Kafka Connect外,Apache Pulsar和RocketMQ也都提供了直接將Pulsar和RocketMQ數據寫入Hudi數據湖的能力擴展,並提供了對應的Hudi Connector,詳情可參考Pulsar-to-Hudi[3]和RocketMQ-to-Hudi[4]

1.2 Z-Ordering,Hilbert Curves 和 Data Skipping

在 0.10.0 中支持基於空間填充曲線排序的索引,首先支持了Z-Ordering[5]和Hilbert Curves[6]。

數據跳過對於優化查詢性能至關重要,通過啟用包含單個數據文件的列級統計信息(如最小值、最大值、空值數等)的列統計索引,對於某些查詢允許對不包含值的文件進行快速裁剪,而僅僅返回命中的文件,當數據按列全局排序時,數據跳過最有效,允許單個 Parquet 文件包含不相交的值範圍,從而實現更有效的裁剪。

使用空間填充曲線(如 Z-order、Hilbert 等)允許基於包含多列的排序鍵有效地對表數據進行排序,同時保留非常重要的屬性:在多列上使用空間填充曲線對行進行排序列鍵也將在其內部保留每個單獨列的排序,在需要通過複雜的多列排序鍵對行進行排序的用例中,此屬性非常方便,這些鍵需要通過鍵的任何子集(不一定是鍵前綴)進行有效查詢,從而使空間填充曲線對於簡單的線性(或字典序)多列排序性能更優。如果應用得當,在此類用例中使用空間填充曲線可能會顯着減少搜索空間,從而大幅度提高查詢性能。

這些功能目前處於實驗階段,我們計劃很快在博客文章中深入研究更多細節,展示空間填充曲線的實際應用。

1.3 Debezium Deltastreamer數據源

在0.10.0中我們在 Deltastreamer 生態系統中添加了兩個新的 debezium 源,Debezium 是一個用於變更數據捕獲 (CDC) 的開源分布式平台。我們添加了PostgresDebeziumSource和MysqlDebeziumSource以分別將Postgres和MySQL數據庫通過 Deltastreamer 將 CDC 日誌寫入 Apache Hudi,藉助此功能我們可以連續捕獲行級更改,將這些更改插入、更新和刪除攝取到 Hudi數據湖中。

1.4 外部配置文件支持

0.10.0版本運行用戶通過配置文件 hudi-default.conf 傳遞配置,而不是直接將配置傳遞給每個 Hudi 作業。默認情況下,Hudi 會加載 /etc/hudi/conf 目錄下的配置文件,用戶可以通過設置 HUDI_CONF_DIR 環境變量來指定不同的配置目錄位置,這對於簡化需要經常重複執行相同的配置(如 Hive 同步設置、寫入/索引調整參數)非常有用。

1.5 元數據表增強

在 0.10.0 中我們通過同步更新而非異步更新對元數據表進行了更多基礎性修復,以簡化整體設計並用於構建未來更高級的功能,用戶可以使用hoodie.metadata.enable=true開啟元數據表。默認情況下基於元數據表的文件列表功能被禁用,我們希望在 0.11.0發布之前修復的一些其他遺留的後續工作,用戶可以關注HUDI-1292[7]了解更多詳情,在打開元數據表之前,請參閱遷移指南部分。

1.6 官網文檔重構改版

該重構對於想了解Hudi內部實現、特性的用戶非常重要,在0.10.0中為以前缺少文檔但存在的功能添加了文檔,同時我們重新組織了官網文檔布局以幫助新用戶提高發現和使用Hudi的特性,同時我們根據社區反饋對文檔進行了許多改進,請參閱最新文檔:https://hudi.apache.org[8]

2. 寫入端改進

提交即時時間(instant time)從秒級格式升級到毫秒級格式,該修改對於用戶透明,用戶無需修改任何配置即可順利進行升級。

Deltastreamer增強

•添加ORCDFSSource以支持 ORC 文件•S3EventsHoodieIncrSource現在可以從單個 S3 元數據表中寫出多張表

Clustering增強

•增加了保留相同文件組的支持以滿足外部索引的要求,同時為處於pending狀態的Clustering操作添加了增量時間線支持。

2.1 DynamoDB鎖提供器

Hudi 在 0.8.0 中增加了對並發寫入的支持,作為功能使用的一部分用戶需要配置鎖服務提供者。在 0.10.0 中我們添加了用戶可以使用的 DynamoDBBased 鎖提供程序。要配置此鎖提供程序,用戶必須設置以下配置:

hoodie.write.lock.provider=org.apache.hudi.aws.transaction.lock.DynamoDBBasedLockProviderHoodie.write.lock.dynamodb.tableHoodie.write.lock.dynamodb.partition_keyhoodie.write.lock.dynamodb.region

此外要設置訪問 AWS 資源的憑證,用戶可以設置以下屬性:

hoodie.aws.access.keyhoodie.aws.secret.keyhoodie.aws.session.token

有關並發控制的更多詳細信息請參考並發控制[9]

2.2 默認配置修改

在0.10.0中我們將 hudi 中所有 shuffle 並行性配置的默認值從1500調整為200。相關配置是hoodie.insert.shuffle.parallelism、hoodie.bulkinsert.shuffle.parallelism、hoodie.upsert.shuffle.parallelism和hoodie.delete.shuffle.parallelism。用戶如果依賴默認設置,請在升級時注意這些配置。不過我們已經在一些規模數據集上測試了這些配置。

我們已啟用基於列表的標記的回滾策略,我們還將基於時間線服務器的標記作為此版本的默認標記,用戶可以在Marker機制[10]閱讀有關基於時間線服務器的標記的更多信息。

Clustering: 默認計劃策略更改為SparkSizeBasedClusteringPlanStrategy。默認情況下Clustering將保留提交元數據,這對於在時間軸中的Replace提交的增量查詢支持非常有用。

2.3 Spark SQL改進

0.10.0中我們對 spark-sql 進行了更多改進,例如添加了對非主鍵的MERGE INTO支持,並新支持了SHOW PARTITIONS和DROP PARTITIONS等操作命令。

同時在0.10.0中支持了Spark 3.1.2版本。

3. 查詢端改進

為 MOR 表添加了 Hive 增量查詢支持和快照查詢的分區修剪,添加了對Clustering的增量讀取支持。

我們改進了列表邏輯,在查詢時間上獲得了 65% 的提升,在針對 Hudi 表的 Presto 查詢上獲得了 2.8 倍的並行度。

總的來說,我們在此版本中進行了大量錯誤修復(多作者、存檔、回滾、元數據、集群等)和穩定性修復,並改進了我們圍繞元數據和集群命令的 CLI,希望用戶在 hudi 0.10.0 可以更順暢地使用。

3.1 Flink集成改進

Flink Reader現在支持增量讀取,設置hoodie.datasource.query.type=incremental以啟用批量執行模式,配置選項read.start-commit指定讀取開始提交,配置選項read.end-commit指定結束提交(兩者都包含)。流式讀取還可以使用相同的選項read.start-commit指定起始偏移量。

支持批量執行模式下的 Upsert 操作,使用 INSERT INTO 語法更新現有數據集。

對於日誌數據等非更新數據集,Flink Writer現在支持直接追加新的數據集而不合併,這是帶有INSERT操作的Copy On Write表類型的默認模式,默認情況下 Writer不合併現有的小文件,設置write.insert.cluster=true以啟用小文件的合併。

write.precombine.field現在成為 flink writer 的可選(不是必需選項),當未指定字段時,如果表模式中有名為 ts 的字段,則 writer 將其用作 preCombine 字段,或 writer 按處理順序比較記錄:總是選擇後面的記錄。

小文件策略更加穩定,新策略中每個bucket分配任務單獨管理一個文件組子集,這意味着bucket分配任務的並行度會影響小文件的數量。

Flink的寫入和讀取也支持元數據Metadata表,元數據表可以明顯減少寫入和讀取是對於底層存儲的分區查找和文件List。配置metadata.enabled=true以啟用此功能。

4. 生態4.1 DBT支持

通過與非常流行的數據轉換工具dbt[11]集成,並已經在dbt 1.0.latest 版本中發布,用戶可以更方便地創建派生的 Hudi 數據集。使用 0.10.0用戶可以使用 dbt 創建增量 Hudi 數據集,詳情請參閱dbt-spark#issue187[12]

4.2 監控

Hudi 現在支持將指標發布到 Amazon CloudWatch。可以通過設置hoodie.metrics.reporter.type=CLOUDWATCH以啟用,要使用的靜態 AWS 憑證可以使用hoodie.aws.access.key、hoodie.aws.secret.key、hoodie.aws.session.token屬性進行配置,在沒有配置靜態 AWS 憑證的情況下,DefaultAWSCredentialsProviderChain將用於通過檢查環境屬性來獲取憑證。可以在HoodieMetricsCloudWatchConfig調整的其他 Amazon CloudWatch配置。

4.3 DevEx

因為默認的 maven spark3 版本沒有升級到 3.1,因此使用maven profile -Dspark3對 Spark 3.1.2 和 0.10.0 構建 Hudi。使用-Dspark3.0.x來構建 Spark 3.0.x 版本

4.4 懸空數據文件修復工具

有時由於各種原因,從回滾中途失敗到 cleaner 未能清理所有數據文件,或者spark 任務失敗創建的數據文件沒有被正確清理,可能會出現懸空的數據文件。因此我們添加了一個修復工具來清理任何不屬於已完成提交的懸空數據文件,如果您在 0.10.0 版本中遇到問題,請通過 hudi-utilities 包中的org.apache.hudi.utilities.HoodieRepairTool試用該工具。同時該工具也具有試運行模式,可以打印懸空文件而不實際刪除它,該工具可從 0.11.0-SNAPSHOT on master 獲取。

5. 遷移指南

•如果從舊版本遷移,請同時查看下面每個版本的遷移指南。•在 0.10.0 中,我們對元數據表進行了一些基礎性修復,因此作為升級的一部分,任何現有的元數據表都會被清理。每當 Hudi 使用更新的表版本啟動時,即 3(或從更早版本升級到 0.10.0),升級步驟將自動執行,由於hoodie.table.version將在升級完成後在屬性文件中更新,因此每個 Hudi 表只會進行一次自動升級步驟。•同樣如果某些用戶想要將 Hudi 從表版本 3 降級到 2 或從 Hudi 0.10.0降級到 0.10.0 之前,則添加了用於降級命令行工具(Command - downgrade)。可以從 0.10.0的 hudi-cli 執行上述命令。•我們圍繞元數據表對 0.10.0 版本進行了一些重大修復,並建議用戶嘗試元數據以從優化的文件列表中獲得更好的性能。作為升級的一部分,請按照以下步驟啟用元數據表。

5.1 啟用元數據表的先決條件

Hudi 寫入和讀取必須在文件系統上執行列表文件操作才能獲得系統的當前視圖。這在雲存儲中可能非常昂貴,同時可能會根據數據集的規模/大小限制請求,因此我們早在 0.7.0版本中就引入了元數據表來緩存Hudi表的文件列表。在 0.10.0 中我們通過同步更新而不是異步更新對元數據表進行了基礎性修復,以簡化整體設計並協助構建多模式索引等未來高級功能,可以使用配置hoodie.metadata.enable=true開啟。默認情況下基於元數據表的文件列表功能被禁用。根據不同的部署模型會有不同的遷移要求,具體如下:

•部署模型1:如果當前部署模型是單寫入器並且所有表服務(清理、集群、壓縮)都配置為內聯,那麼您可以打開元數據表而無需任何額外配置。•部署模型2:如果當前部署模型是多寫入器並配置了鎖提供程序,那麼您可以打開元數據表而無需任何額外配置。•部署模型3:如果當前部署模型是單寫入器並配置了異步表服務(例如Cleaning、Clustering、Compaction),那麼在打開元數據表之前必須配置鎖提供程序。即使您已經打開了元數據表,並且部署模型使用了異步表服務,那麼在升級到此版本之前必須配置鎖提供程序。

5.2 升級步驟

對於部署模型1,使用 0.10.0 重新啟動即可。

對於部署模型2,如果打算使用元數據表,則必須在所有編寫器中啟用元數據配置,否則會導致不一致寫入器的數據丟失。

對於部署模型3,重新啟動單個寫入器和異步服務即可。如果將異步服務配置為與編寫器分開運行,則必須在所有編寫器和異步作業之間具有一致的元數據配置,如果啟用元數據表,請記住按照上面的詳細說明配置鎖提供程序,關於鎖提供程序的配置可參考concurrency_control[13]

要利用基於元數據表的文件列表,讀取時必須在查詢時顯式打開元數據配置,否則讀取時將不會利用元數據表中的文件列表。

5.3 Spark-SQL主鍵要求

Hudi中的Spark SQL需要在sql語句中通過tblproperites或options指定primaryKey。對於更新和刪除操作還需要指定preCombineField。這些要求與 Hudi DataSource 寫入保持一致,這解決了以前版本中報告的許多行為差異。

要指定primaryKey、preCombineField或其他 Hudi 配置,與options方式相比,tblproperties方式是首選方式。Spark SQL 如Create Table語法詳情參考Create-table-datasource[14]。總之任何在 0.10.0 之前創建的沒有主鍵的 Hudi 表都需要使用帶有 0.10.0 的主鍵字段重新創建,另外我們計劃在未來版本中去掉對主鍵的限制。

6. 源碼下載

源碼下載 :Apache Hudi 0.10.0 Source Release[15]

Maven倉庫包地址:地址[16]

7. 感謝

感謝參與0.10.0版本的所有貢獻者,歡迎廣大數據湖愛好者加入Apache Hudi社區,歡迎star & fork https://github.com/apache/hudi


引用鏈接

[1]README-Hudi-Kafka-Connect:https://github.com/apache/hudi/blob/master/hudi-kafka-connect/README.md[2]RFC-32_Kafka Connect Sink For Hudi:https://cwiki.apache.org/confluence/display/HUDI/RFC-32+Kafka+Connect+Sink+for+Hudi[3]Pulsar-to-Hudi:https://github.com/streamnative/pulsar-io-hudi[4]RocketMQ-to-Hudi:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-connect-hudi[5]Z-Ordering:https://en.wikipedia.org/wiki/Z-order_curve[6]Hilbert Curves:https://en.wikipedia.org/wiki/Hilbert_curve[7]HUDI-1292:https://issues.apache.org/jira/browse/HUDI-1292[8]https://hudi.apache.org:https://hudi.apache.org/docs/overview[9]並發控制:https://hudi.apache.org/docs/next/concurrency_control[10]Marker機制:https://hudi.apache.org/blog/2021/08/18/improving-marker-mechanism[11]dbt:https://github.com/dbt-labs/[12]dbt-spark#issue187:https://github.com/dbt-labs/dbt-spark/pull/210[13]concurrency_control:https://hudi.apache.org/docs/concurrency_control[14]Create-table-datasource:https://spark.apache.org/docs/latest/sql-ref-syntax-ddl-create-table-datasource.html[15]Apache Hudi 0.10.0 Source Release:https://www.apache.org/dyn/closer.lua/hudi/0.10.0/hudi-0.10.0.src.tgz[16]地址:https://hudi.apache.org/releases/release-0.10.0

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()