重點特性
1. Clustering
0.7.0版本中支持了對Hudi表數據進行Clustering(對數據按照數據特征進行聚簇,以便優化文件大小和數據布局),Clustering提供了更靈活地方式增加文件大小,有了Clustering特性,便可更快速地攝取數據,然后聚簇為更大的文件,實驗數據表明查詢性能可以提升34倍,文件數可以減少1020倍;另外Clustering對於查詢側優化也很明顯,在查詢時通常會基於字段進行Clustering,通過完全跳過一些文件來極大提升查詢性能,這與雲數倉Snowflake提供的Clustering功能非常類似,我們非常高興地宣稱這個特性在0.7.0版本中完全開源免費。
想要了解更多Clustering細節,可以參考RFC-19,可以查閱這些配置來在你的數據管道中啟用Clustering,現在Hudi支持同步和異步的Clustering模式。
2. Metadata表
Hudi項目始於Uber,開始是基於HDFS實現的數據湖,對於雲上對象存儲的數據湖性能不如HDFS。在0.7.0版本,我們解決了該問題,即支持了內部Metadata表,此表可存儲索引數據,其他元數據信息等。
Metadata表的實現使用了Hudi MOR表,這意味着像其他任何Hudi表一樣,可以被壓縮(Compaction)、清理(Clean)、增量更新(incrementally updated)。 而且與其他項目中的類似實現不同,我們選擇將文件列表等信息索引為HFile格式(格式可插拔),HFile提供了很好的點查性能,可以高效獲取分區文件列表等信息。
在0.7.0版本中,在寫入端配置hoodie.metadata.enable=true
即可構建Metadata表,這樣后續操作將不再調用fs.listStatus()
接口,我們引入了一種同步機制來保證對數據timeline中進行的文件新增/刪除操作都會同步到Metadata表。
測試有25W個文件的表,Metadata表相比使用Spark並發Listing要快2~3倍,更多設計細節可查閱RFC-15,其他Metadata表相關配置可參考這里,提供了參數以便在生產環境中安全使用該特性。
3. Flink/Java客戶端
Hudi最開始設計時依賴Spark,但隨着項目成為Apache頂級項目,我們意識到需要抽象內部表格式、表服務、寫入層的代碼以支持更多的引擎。在0.7.0版本,我們完成了寫入層的解耦,添加了Flink和Java客戶端,現在你可以使用HoodieFlinkStreamer
來消費Kafka中的數據,以寫入Hudi的COW表中。
4. 寫入端優化
- Spark3支持;0.7.0版本支持使用Spark3進行寫入和查詢,請注意使用scala 2.12版本的hudi-spark-bundle包;
- 並行Listing;我們已將所有List操作移至
HoodieTableMetadata
接口下,該接口可以多線程/Spark並行執行,該優化可以在未開啟Metadata表時提升清理、壓縮性能。 - Kafka Commit Callbacks;0.7.0添加了
HoodieWriteCommitKafkaCallback
接口,當每次進行commit后可以向Kafka中發送事件,以此來觸發派生/ETL數據管道,類似Apache Airflow中的Sensors - Insert Overwrite/Insert Overwrite Table;0.7.0版本中新增了這兩種操作類型,主要用於批處理ETL作業,該作業通常會在每次運行時覆蓋整個表/分區。考慮到這些操作可以批量替換目標表,因此這些操作比upsert更合適,請查看[示例](/docs/ quick-start-guide.html#insert-overwrite-table)。
- 刪除分區支持:對於使用WriteClient/RDD級別API的用戶,Hudi提供了一個新的API來刪除整個分區,而不是采用記錄級別刪除方式。
- 新增
DefaultHoodieRecordPayload
解決亂序問題;當前默認的OverwriteWithLatestAvroPayload
將覆蓋存儲中已有的值,即使使用較舊值進行upsert。0.7.0版本添加了一個新的DefaultHoodieRecordPayload
和一個有效負載配置hoodie.payload.ordering.field
來指定一個字段,可以將傳入的upsert記錄與已存儲的記錄進行比較,以決定是否覆蓋。推薦用戶使用這種更新、更靈活的Payload模型。 - Hive同步;支持使用
SlashEncodedHourPartitionValueExtractor
同步小時分區至Hive中。 - 支持IBM雲對象存儲、Open Java 9版本。
5. 查詢端優化
- MOR增量查詢(Spark Datasource),0.7.0版本支持使用Spark datasource增量查詢MOR表,在后續版本中會繼續加強和重構該特性。
- Metadata表支持File Listings,用戶還可以將元數據表用於以下查詢端,對於Hive,設置
hoodie.metadata.enable = true
會話
屬性,對於使用SparkSQL查詢注冊的Hive表,請使用參數--conf spark.hadoop.hoodie.metadata.enable = true
來允許從元數據中獲取分區的文件列表,而非使用File Listing。
貢獻者
prashantwason ,Trevor-zhang,satishkotha,nbalajee,wangxianghu,hddong,nsivabalan,xushiyan,cdmikechen,garyli1019,kwondw,sreeram26,chuangehh,zhedoubushishi,modi95,linshan-ma,Karl-WangSK,bvaradar,liujinhui1994,shenh062326,xushiyan,pratyakshsharma,afilipchik,Kaiux,lw309637554,vinothchandar,dugenkui03,leesf,yanghua,rmpifer,hj2016,guykhazma,bhasudha,hotienvu,n3nash,v3nkatesh,pengzhiwei2018,yui2010,jshmchenxi,danny0405,yui2010,lichang-bd,nbalajee,umehrot2