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属性。 |
| 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 | 是否启用用户代理。取值如下:
|
示例
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客户端。
该文章对您有帮助吗?