Hudi是一種資料湖的儲存格式,在Hadoop檔案系統之上提供了更新資料和刪除資料的能力,以及消費變化資料的能力。EMR Presto已經將相關JAR包整合至獨立的Hudi Plugin裡面,EMR Hudi連接器目前支援查詢COW和MOR表。
背景資訊
EMR Hudi的詳細資料,請參見Hudi概述。
前提條件
已建立Hadoop叢集,並選擇了Presto服務,或者建立單獨的Presto叢集,詳情請參見建立叢集。
使用限制
- EMR-3.38.0及後續版本的Hadoop叢集或Presto叢集,支援配置Hudi連接器。
- 只支援Hudi COW表的快照查詢。
- 只支援Hudi MOR表的快照查詢和讀取最佳化查詢。
- 不支援增量查詢。
配置連接器
修改Hudi連接器配置,詳情請參見修改內建連接器。
Hudi連接器預設配置,您可以進入EMR控制台的Presto服務的配置頁面,在服务配置地區,單擊hudi.properties頁簽。您可以看到以下參數,參數值請根據您實際情況修改。
| 參數 | 描述 |
| hive.recursive-directories | 允許從表或分區所在位置的子目錄讀取資料,類似Hive的hive.mapred.supports.subdirectories屬性。預設值為false。 |
| hive.metastore.uri | Hive Metastore使用Thrift協議串連的URI。 預設值格式 |
| hive.config.resources | HDFS設定檔的列表,多個設定檔時以逗號(,)分隔。這些設定檔必須存在於Presto啟動並執行所有主機上。 重要 僅在必須訪問HDFS的情況下配置此項。 預設值為 |
| hive.delta-table-enabled | 是否支援Presto讀取Delta Lake表。取值如下:
|
| hive.delta-compatible-mode-enabled | Delta Lake表是否啟用相容模式。取值如下:
|
| hive.hdfs.impersonation.enabled | 是否啟用使用者代理程式。取值如下:
|
| hive.metastore.use-dlf-catalog | 是否將Datalake Formation Catalog用作Hive Metastore。 預設值為default。 |
樣本
Hudi表作為Hive的外表格儲存體,可以通過串連Hive連接器來訪問Hudi表進行資料查詢。Hudi表的產生以及同步到Hive表中的步驟,請參見Hudi與Spark SQL整合和Spark寫Hudi。
產生資料和查詢資料樣本如下所示:
- 使用SSH方式登入EMR叢集,詳情請參見登入叢集。
- 執行以下命令,進入spark-sql命令列。
spark-sql --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \ --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'當返回資訊中包含如下資訊時,表示已進入spark-sql命令列。spark-sql> - 執行以下命令,建立測試表。
create table if not exists emr_test( id bigint, name string, price double ) using hudi options ( type = 'mor', primaryKey = 'id,name' ); - 執行以下命令,插入測試資料。
insert into emr_test select 1, 'a2', 10; insert into emr_test select 1, 'a1', 10; insert into emr_test select 2, 'a1', 20;說明 EMR的Spark SQL會自動同步Hudi資料到DLF或Hive MetaStore。 - 在Presto用戶端中查詢資料。
- 執行以下命令,進入Presto用戶端。
presto --server emr-header-1:9090 --catalog hudi --schema default --user hadoop - 執行以下命令,查詢表資訊。
select * from emr_test;返回資訊如下。_hoodie_commit_time | _hoodie_commit_seqno | _hoodie_record_key | _hoodie_partition_path | _hoodie_file_name | id | name | price ---------------------+----------------------+--------------------+------------------------+-------------------------------------------------------------------------+----+------+------- 20211025145616 | 20211025145616_0_1 | id:1,name:a2 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-20-1604_20211025145616.parquet | 1 | a2 | 10.0 20211025145629 | 20211025145629_0_1 | id:1,name:a1 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-48-3211_20211025145629.parquet | 1 | a1 | 10.0 20211025145640 | 20211025145640_0_2 | id:2,name:a1 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-76-4818_20211025145640.parquet | 2 | a1 | 20.0 (3 rows)
- 執行以下命令,進入Presto用戶端。
- 在spark-sql中更新資料。
- 執行以下命令,進入spark-sql命令列。
spark-sql --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \ --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'當返回資訊中包含如下資訊時,表示已進入spark-sql命令列。spark-sql> - 執行以下命令,更新id為2的price。
update emr_test set price = price + 20 where id = 2;
- 執行以下命令,進入spark-sql命令列。
- 更新資料後,在Presto用戶端中查詢資料。
- 執行以下命令,進入Presto用戶端。
presto --server emr-header-1:9090 --catalog hudi --schema default --user hadoop - 執行以下命令,查詢表資訊。
select * from emr_test;返回資訊如下。_hoodie_commit_time | _hoodie_commit_seqno | _hoodie_record_key | _hoodie_partition_path | _hoodie_file_name | id | name | price ---------------------+----------------------+--------------------+------------------------+-------------------------------------------------------------------------+----+------+------- 20211025145616 | 20211025145616_0_1 | id:1,name:a2 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-20-1604_20211025145616.parquet | 1 | a2 | 10.0 20211025145629 | 20211025145629_0_1 | id:1,name:a1 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-48-3211_20211025145629.parquet | 1 | a1 | 10.0 20211025145640 | 20211025145640_0_2 | id:2,name:a1 | | ac4ec1e6-528d-4189-bde6-d09e137f63f6-0_0-76-4818_20211025145640.parquet | 2 | a1 | 40.0 (3 rows)
- 執行以下命令,進入Presto用戶端。