Hudi連接器
Hudi是一種數(shù)據(jù)湖的存儲格式,在Hadoop文件系統(tǒng)之上提供了更新數(shù)據(jù)和刪除數(shù)據(jù)的能力,以及消費變化數(shù)據(jù)的能力。EMR Trino已經(jīng)將相關(guān)JAR包集成至獨立的Hudi Plugin里面,EMR Hudi連接器目前支持查詢COW和MOR表。
背景信息
EMR Hudi的詳細信息,請參見Hudi概述。
前提條件
已創(chuàng)建DataLake集群或Hadoop集群,并選擇了Presto服務(wù),詳情請參見創(chuàng)建集群。
使用限制
僅DataLake集群和EMR-3.38.0及后續(xù)版本的Hadoop集群,支持配置Hudi連接器。
只支持Hudi COW表的快照查詢。
部分支持Hudi MOR表的快照查詢和讀優(yōu)化查詢,但并未覆蓋所有場景。因此,在生產(chǎn)環(huán)境中使用時需要謹慎考慮。
不支持增量查詢。
配置連接器
修改Hudi連接器配置,詳情請參見修改內(nèi)置連接器。
使用Hive元數(shù)據(jù)
Hudi連接器默認配置,您可以進入EMR控制臺的Trino服務(wù)的配置頁面,在服務(wù)配置區(qū)域,單擊hudi.properties頁簽。您可以看到以下參數(shù),參數(shù)值請根據(jù)您實際情況修改。
參數(shù) | 描述 |
hive.metastore.uri | Hive Metastore使用Thrift協(xié)議連接的URI。
|
hive.config.resources | HDFS配置文件的列表,多個配置文件時以逗號(,)分隔。這些配置文件必須存在于Trino運行的所有主機上。 重要 僅在必須訪問HDFS的情況下配置此項。
|
hive.hdfs.impersonation.enabled | 是否啟用用戶代理。取值如下:
|
使用DLF元數(shù)據(jù)
如果數(shù)據(jù)表的元數(shù)據(jù)使用了DLF統(tǒng)一元數(shù)據(jù),則還需為Hive、Iceberg和Hudi等連接器進行額外的配置。此時查詢不再依賴數(shù)據(jù)集群,hive.metastore.uri可以任意填寫,Trino能夠直接訪問到同一個賬號下的DLF元數(shù)據(jù)。
參數(shù) | 描述 | 備注 |
hive.metastore | MetaStore類型。 | 固定值為DLF。 |
dlf.catalog.region | DLF服務(wù)的地域名。 | 詳情請參見已開通的地域和訪問域名。 說明 請和dlf.catalog.endpoint選擇的地域保持一致。 |
dlf.catalog.endpoint | DLF服務(wù)的Endpoint。 | 詳情請參見已開通的地域和訪問域名。 推薦您設(shè)置dlf.catalog.endpoint參數(shù)為DLF的VPC Endpoint。例如,如果您選擇的地域為cn-hangzhou地域,則dlf.catalog.endpoint參數(shù)需要配置為dlf-vpc.cn-hangzhou.aliyuncs.com。 說明 您也可以使用DLF的公網(wǎng)Endpoint,如果您選擇的地域為cn-hangzhou地域,則dlf.catalog.endpoint參數(shù)需要配置為dlf.cn-hangzhou.aliyuncs.com。 |
dlf.catalog.akMode | DLF服務(wù)的Access Key模式。 | 建議配置為EMR_AUTO。 |
dlf.catalog.proxyMode | DLF服務(wù)的代理模式。 | 建議配置為DLF_ONLY。 |
dlf.catalog.uid | 阿里云賬號的賬號ID。 | 登錄賬號信息,請通過用戶信息頁面獲取。 |
示例
Hudi表作為Hive的外表存儲,可以通過連接Hive連接器來訪問Hudi表進行數(shù)據(jù)查詢。Hudi表的生成以及同步到Hive表中的步驟,請參見Hudi與Spark SQL集成和基礎(chǔ)使用。
生成數(shù)據(jù)和查詢數(shù)據(jù)示例如下所示:
登錄集群,詳情請參見登錄集群。
執(zhí)行以下命令,進入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>
執(zhí)行以下命令,創(chuàng)建測試表。
create table if not exists emr_test( id bigint, name string, price double ) using hudi options ( type = 'mor', primaryKey = 'id,name' );
執(zhí)行以下命令,插入測試數(shù)據(jù)。
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數(shù)據(jù)到DLF或Hive MetaStore。
在Trino客戶端中查詢數(shù)據(jù)。
執(zhí)行以下命令,進入Trino命令行。
trino --server master-1-1:9090 --catalog hudi --schema default --user hadoop
執(zhí)行以下命令,查詢表信息。
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中更新數(shù)據(jù)。
執(zhí)行以下命令,進入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>
執(zhí)行以下命令,更新id為2的price。
update emr_test set price = price + 20 where id = 2;
更新數(shù)據(jù)后,在Trino客戶端中查詢數(shù)據(jù)。
執(zhí)行以下命令,進入Trino命令行。
trino --server master-1-1:9090 --catalog hudi --schema default --user hadoop
執(zhí)行以下命令,查詢表信息。
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)