Hudi是一種資料湖的儲存格式,在Hadoop檔案系統之上提供了更新資料和刪除資料的能力,以及消費變化資料的能力。EMR Trino已經將相關JAR包整合至獨立的Hudi Plugin裡面,EMR Hudi連接器目前支援查詢COW和MOR表。
背景資訊
EMR Hudi的詳細資料,請參見Hudi概述。
前提條件
已建立DataLake叢集、Custom叢集或Hadoop叢集,並選擇了Trino服務,詳情請參見建立叢集。
使用限制
僅DataLake叢集和EMR-3.38.0及後續版本的Hadoop叢集,支援配置Hudi連接器。
只支援Hudi COW表的快照查詢。
部分支援Hudi MOR表的快照查詢和讀取最佳化查詢,但並未覆蓋所有情境。因此,在生產環境中使用時需要謹慎考慮。
不支援增量查詢。
配置連接器
修改Hudi連接器配置,詳情請參見修改內建連接器。
使用Hive中繼資料
Hudi連接器預設配置,您可以進入EMR控制台的Trino服務的配置頁面,在服務配置地區,單擊hudi.properties頁簽。您可以看到以下參數,參數值請根據您實際情況修改。
參數 | 描述 |
hive.metastore.uri | Hive Metastore使用Thrift協議串連的URI。
|
hive.config.resources | HDFS設定檔的列表,多個設定檔時以逗號(,)分隔。這些設定檔必須存在於Trino啟動並執行所有主機上。 重要 僅在必須訪問HDFS的情況下配置此項。
|
hive.hdfs.impersonation.enabled | 是否啟用使用者代理程式。取值如下:
|
使用DLF中繼資料
如果資料表的中繼資料使用了DLF統一中繼資料,則還需為Hive、Iceberg和Hudi等連接器進行額外的配置。此時查詢不再依賴資料集群,hive.metastore.uri可以任意填寫,Trino能夠直接存取到同一個帳號下的DLF中繼資料。
參數 | 描述 | 備忘 |
hive.metastore | MetaStore類型。 | 固定值為DLF。 |
dlf.catalog.region | DLF服務的地區名。 | 詳情請參見已開通的地區和訪問網域名稱。 說明 請和dlf.catalog.endpoint選擇的地區保持一致。 |
dlf.catalog.endpoint | DLF服務的Endpoint。 | 詳情請參見已開通的地區和訪問網域名稱。 推薦您設定dlf.catalog.endpoint參數為DLF的VPC Endpoint。例如,如果您選擇的地區為cn-hangzhou地區,則dlf.catalog.endpoint參數需要配置為dlf-vpc.cn-hangzhou.aliyuncs.com。 說明 您也可以使用DLF的公網Endpoint,如果您選擇的地區為cn-hangzhou地區,則dlf.catalog.endpoint參數需要配置為dlf.cn-hangzhou.aliyuncs.com。 |
dlf.catalog.akMode | DLF服務的Access Key模式。 | 建議配置為EMR_AUTO。 |
dlf.catalog.proxyMode | DLF服務的代理模式。 | 建議配置為DLF_ONLY。 |
dlf.catalog.uid | 阿里雲帳號的帳號ID。 | 登入帳號資訊,請通過使用者資訊頁面擷取。 |
樣本
Hudi表作為Hive的外表格儲存體,可以通過串連Hive連接器來訪問Hudi表進行資料查詢。Hudi表的產生以及同步到Hive表中的步驟,請參見Hudi與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>
執行以下命令,建立測試表。
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。
在Trino用戶端中查詢資料。
執行以下命令,進入Trino命令列。
trino --server master-1-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)
在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;
更新資料後,在Trino用戶端中查詢資料。
執行以下命令,進入Trino命令列。
trino --server master-1-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)