Trino 查询 Hudi 表
简介
Trino是一个Java开发的高性能SQL查询引擎。其最大的特点是数据源的支持非常广泛。本篇为大家带来使用Trino读取Hudi表的方法。
环境信息
- Trino 476
- OpenJDK 24
- Hudi 0.15.0
- Hive 3.1.0
- Hadoop 3.1.1
前提条件
Hudi表通过Flink或者Spark的Hive Sync同步到Hive元数据中,或者是通过配置了Hive metastore的Spark或Flink插入Hudi数据(即表元数据在Hive metastore中可见)。
安装和配置Trino
下载所需软件包:
# trino本体
wget https://repo1.maven.org/maven2/io/trino/trino-server/476/trino-server-476.tar.gz
# OpenJDK 24
wget https://gh-proxy.com/https://github.com/adoptium/temurin24-binaries/releases/download/jdk-24.0.2%2B12/OpenJDK24U-jdk_x64_linux_hotspot_24.0.2_12.tar.gz
# trino命令行工具
wget https://repo1.maven.org/maven2/io/trino/trino-cli/476/trino-cli-476-executable.jar
解压trino本体和OpenJDK 24
接下来是配置Trino。
新增$TRINO_HOME/etc/config.properties,增加如下内容:
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=9080
discovery.uri=http://server_ip:9080
其中:
- 这里使用单节点模式,当前机器既是worker节点又是coordinator节点。
- http端口号配置为9080。
- 同一集群的discovery.uri必须相同。
新增$TRINO_HOME/etc/node.properties,增加如下内容:
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/opt/zy/trino/trino-server-476/var/trino/data
其中:
- 同一集群中所有的节点必须配置相同的node.environment。
- 同一集群中每个节点必须具有不同的
node.id。 - node.data-dir为节点存放数据的目录。
新增$TRINO_HOME/etc/jvm.config,增加如下内容:
-server
-Xmx6G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-Dfile.encoding=UTF-8
# Allow loading dynamic agent used by JOL
-XX:+EnableDynamicAgentLoading
即节点JVM配置参数。根据实际情况调整。作为测试不需要过多的内存占用,可调小-Xmx。
参考链接:https://trino.io/docs/current/installation/deployment.html
最后配置Hudi的catalog。新增$TRINO_HOME/etc/catalog/hudi.properties,增加如下配置:
connector.name=hudi
hive.metastore.uri=thrift://metastore_ip:9083
fs.hadoop.enabled=true
hive.config.resources=/usr/hdp/3.0.1.0-187/hadoop/conf/hdfs-site.xml
其中:
- connector.name指定hudi。
- hive.metastore.uri指定hive metastore的thirft协议连接地址。
- fs.hadoop.enabled=true为启用HDFS存储。
- hive.config.resources配置HDFS hdfs-site.xml配置文件的路径。必须确保该文件在trino节点上可被访问。
注意:Trino Hudi connector只配置Hudi相关配置是不够的。必须根据Hudi的实际存储类型增加存储的配置。上面例子中使用HDFS作为Hudi的存储,因此必须增加HDFS的配置。
参考链接:
- https://trino.io/docs/current/connector/hudi.html
- https://trino.io/docs/current/object-storage/file-system-hdfs.html
如果开启了Kerberos,需要使用如下配置:
connector.name=hudi
hive.metastore.uri=thrift://metastore_ip:9083
fs.hadoop.enabled=true
hive.config.resources=/usr/hdp/3.0.1.0-187/hive/conf/hive-site.xml
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.trino.principal=hive/_HOST@PAUL.COM
hive.hdfs.trino.keytab=/etc/security/keytabs/hive.service.keytab
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/_HOST@PAUL.COM
hive.metastore.client.principal=hive/_HOST@PAUL.COM
hive.metastore.client.keytab=/etc/security/keytabs/hive.service.keytab
配置完毕之后使用如下命令启动trino server:
export JAVA_HOME=/path/to/OpenJDK24
cd $TRINO_HOME
bin/launcher restart
查询数据
使用OpenJDK24启动trino命令行。参数为trino集群的coordinator节点URL。如下所示:
/path/to/OpenJDK24/bin/java -jar trino-cli-476-executable.jar http://server_ip:9080
查看配置了哪些catalog:
trino> show catalogs;
Catalog
---------
hudi
system
(2 rows)
Query 20250821_014718_00004_wbrkq, FINISHED, 1 node
Splits: 5 total, 5 done (100.00%)
0.71 [0 rows, 0B] [0 rows/s, 0B/s]
查看hudi catalog下面有哪些schema:
trino> show schemas from hudi;
Schema
--------------------------
default
default_database
information_schema
(3 rows)
Query 20250821_014754_00005_wbrkq, FINISHED, 1 node
Splits: 3 total, 3 done (100.00%)
0.27 [3 rows, 111B] [18 rows/s, 419B/s]
查看hudi catalog的default schema下面有哪些表:
trino> show tables from hudi.default;
Table
---------------------
hive_demo
hudi_cow_tbl
hudi_cow_tbl_bucket
hudi_cow_tbl_ro
hudi_cow_tbl_rt
hudi_mor_tbl
t1
(7 rows)
Query 20250821_014859_00006_wbrkq, FINISHED, 1 node
Splits: 5 total, 5 done (100.00%)
0.42 [7 rows, 203B] [16 rows/s, 481B/s]
查询hudi_cow_tbl_ro的内容:
trino> select * from hudi.default.hudi_cow_tbl_ro;
_hoodie_commit_time | _hoodie_commit_seqno | _hoodie_record_key | _hoodie_partition_path | _hoodie_file_na
---------------------+-----------------------+--------------------+------------------------+-------------------------------------------
20250811143810562 | 20250811143810562_0_0 | 1 | | 14b8fdb7-a02a-45e4-92c3-31bd3790b74f-0_0-5
(1 row)
Query 20250821_014933_00007_wbrkq, FINISHED, 1 node
Splits: 1 total, 1 done (100.00%)
0.29 [1 rows, 425KiB] [3 rows/s, 1.45MiB/s]
表列太多显示不全,可以使用select指定字段查询:
trino> desc hudi.default.hudi_cow_tbl_ro;
Column | Type | Extra | Comment
------------------------+---------+-------+---------
_hoodie_commit_time | varchar | |
_hoodie_commit_seqno | varchar | |
_hoodie_record_key | varchar | |
_hoodie_partition_path | varchar | |
_hoodie_file_name | varchar | |
id | integer | |
name | varchar | |
price | double | |
ts | bigint | |
(9 rows)
Query 20250821_015010_00008_wbrkq, FINISHED, 1 node
Splits: 5 total, 5 done (100.00%)
0.38 [9 rows, 719B] [23 rows/s, 1.86KiB/s]
trino> select id, name, price, ts from hudi.default.hudi_cow_tbl_ro;
id | name | price | ts
----+------+-------+------
1 | a2 | 30.0 | 2000
(1 row)
Query 20250821_015031_00009_wbrkq, FINISHED, 1 node
Splits: 1 total, 1 done (100.00%)
0.20 [1 rows, 425KiB] [4 rows/s, 2.05MiB/s]
问题和解决方法
查询保存在启用了Namenode HA的HDFS上的Hudi表报错
错误为:
trino> select * from hudi.default.hudi_cow_tbl_bucket;
Query 20250901_033036_00001_nr9tk failed: Failed to check for Hudi table at location: hdfs://hadoop336/hudi/hudi_cow_tbl_bucket
原因为hudi catalog配置中的hive.config.resources配置成了core-site.xml。需要配置为hdfs-site.xml文件。