Trino 查询 Hudi 表

作者: AlienPaul | 来源:发表于2025-09-09 09:54 被阅读0次

简介

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的配置。

参考链接:

如果开启了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文件。

相关文章

网友评论

    本文标题:Trino 查询 Hudi 表

    本文链接:https://www.haomeiwen.com/subject/ckwxzjtx.html