1.如何寫入Hudi數據集
通常,你會從源獲取部分更新/插入,然後對Hudi數據集執行寫入操作。如果從其他標準來源(如Kafka或tailf DFS)中提取數據,那麼DeltaStreamer將會非常有用,其提供了一種簡單的自我管理解決方案,可將數據寫入Hudi。你還可以自己編寫代碼,使用Spark數據源API從自定義源獲取數據,並使用Hudi數據源寫入Hudi。
2. 如何部署Hudi作業
寫入Hudi的好處是它可以像在YARN/Mesos甚至是K8S羣集上運行的任何其他Spark作業一樣運行。只需使用Spark UI即可查看寫入操作,而無需單獨搭建Hudi集羣。
3. 如何查詢剛寫入的Hudi數據集
除非啓用了Hive同步,否則與其他任何源一樣,通過上述方法寫入Hudi的數據集可以簡單地通過Spark數據源進行查詢。
val hoodieROView = spark.read.format("org.apache.hudi").load(basePath + "/path/to/partitions/*")
val hoodieIncViewDF = spark.read().format("org.apache.hudi")
.option(DataSourceReadOptions.VIEW_TYPE_OPT_KEY(), DataSourceReadOptions.VIEW_TYPE_INCREMENTAL_OPT_VAL())
.option(DataSourceReadOptions.BEGIN_INSTANTTIME_OPT_KEY(), <beginInstantTime>)
.load(basePath);
請注意:當前不支持從Spark數據源讀取實時視圖。請使用下面的Hive路徑。
如果在deltastreamer工具或數據源中啓用了Hive Sync,則該數據集會同步到Hive的幾張表中,可以使用HiveQL,Presto或 SparkSQL進行讀取。點擊這裏查看更多。
4. Hudi如何處理輸入中的重複記錄
在數據集上執行 upsert
操作時,提供的記錄包含給定鍵的多條記錄,然後通過重複調用有效負載類的 preCombine
方法將所有記錄合併爲一個最終值。默認情況下會選擇最大值的記錄(由 compareTo
決定)。
對於 insert
或 bulk_insert
操作,不執行 preCombine
。因此,如果你的輸入包含重複項,則數據集也將包含重複項。如果您不希望重複的記錄,請使用upsert或在數據源或deltastreamer中指定刪除重複數據的配置項。
5. 可以實現自定義合併邏輯處理輸入記錄和存儲的記錄嗎?
與上面類似,定義有效負載類定義的方法(combineAndGetUpdateValue(),getInsertValue()),這些方法控制如何將存儲的記錄與輸入的更新/插入組合以生成最終值以寫回到存儲中。
6. 如何刪除數據集中的記錄?
GDPR使刪除成爲數據管理工具箱中的必備工具。Hudi支持軟刪除和硬刪除。有關如何實際執行它們,請參見此處。
7. 如何將數據遷移到Hudi
Hudi對遷移提供了內置支持,可使用 hudi-cli
提供的 HDFSParquetImporter
工具將整個數據集一次性寫入Hudi。也可以使用Spark數據源API讀取和寫入數據集。遷移後,可以使用此處討論的常規方法執行寫操作。這裏也詳細討論該問題,包括部分遷移的方法。
8. 如何將Hudi配置傳遞給Spark作業
這裏涵蓋了數據源和Hudi寫入客戶端(deltastreamer和數據源都會內部調用)的配置項。在DeltaStreamer之類的工具上調用 --help
都會打印所有使用選項。許多控制 upsert
、調整文件大小的選項是在客戶端級別定義的,下面是將它們傳遞給可用於寫數據配置項的方式。
1). 對於Spark DataSource,可以使用DataFrameWriter的 options
API來傳遞這些配置項。
inputDF.write().format("org.apache.hudi")
.options(clientOpts) // any of the Hudi client opts can be passed in as well
.option(DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY(), "_row_key")
...
2). 直接使用HoodieWriteClient時,只需使用配置來構造HoodieWriteConfig對象。
3). 使用HoodieDeltaStreamer工具提取時,可以在屬性文件中設置配置項,並將該文件作爲命令行參數 --props
傳遞。
9. 可以在Apache Hive Metastore中註冊Hudi數據集嗎
可以, 可以通過獨立的Hive Sync工具或使用deltastreamer工具或數據源中的選項來執行此操作。
10. Hudi索引的工作原理及其好處是什麼?
索引是Hudi寫入的關鍵部分,它始終將給定的 recordKey
映射到Hudi內部的文件組( FileGroup
)。這樣可以更快地識別受給定寫入操作影響的文件組。
Hudi支持以下幾種索引配置
-
HoodieBloomIndex(默認):使用bloom過濾器和範圍信息,並在parquet/基礎文件(不久後的日誌文件也支持)的頁腳中放置該信息。
-
HoodieGlobalBloomIndex:默認索引僅在單個分區內強制執行鍵的唯一性,即要求用戶知道存儲給定記錄鍵的分區。這可以幫助非常大的數據集很好地建立索引。但是,在某些情況下,可能需要在所有分區上執行重複數據刪除/強制唯一性操作,這就需要全局索引。如果使用此選項,則將傳入記錄與整個數據集中的文件進行比較,並確保僅在一個分區中存在
recordKey
。 -
HBaseIndex:Apache HBase是一個鍵值存儲,可以將索引存儲在HBase內,如果已經在使用HBase,這將會非常方便。
也可以自定義索引,需要實現HoodieIndex類並在配置中配置索引類名稱。