本文介绍使用Trino时的常见问题。
Trino与Presto的区别与联系是什么?
Trino的前身是PrestoSQL,是Presto的创始人团队从Facebook脱离之后成立的商业公司Starburst旗下的开源产品,于2021年正式更名为Trino。相应的,Presto依然由Facebook负责维护,一般被称为PrestoDB。在分离之后,二者具有不同的发展方向。但是基本语法和使用方式相似。
EMR-3.44.0和EMR-5.10.0版本开始改用社区正式名称Trino,之前各版本控制台显示为Presto,内核其实是Trino,使用时请注意区分。
Trino的各个版本有什么区别?
Trino各个版本的内容变化,可参见Trino官方更新日志。Trino的性能表现随着版本更新存在一些优化,因此建议您尽量选择较新版本。
Trino在EMR上的部署形态是什么样的?是否支持高可用?
Trino具有标准的M/S架构,其Coordinator部署在master-1-1节点上;Worker部署在所有Core或Task节点上。
Trino目前不支持高可用。在高可用集群上,Trino仅在master-1-1节点上部署Coordinator。在创建集群时,如果您不需要混合部署Hadoop,只选用Trino服务即可。
如果您不需要混合部署Hadoop,请注意不要开启高可用开关,避免造成浪费。
Trino如何连接DLF?开启了DLF后是否还能连接MetaStore?默认提供的连接器不够用怎么办?
3.45.0之前版本和5.11.0之前版本的DataLake集群,如果创建集群时选中了Hive服务,且选择了DLF元数据,hive、iceberg、hudi、delta lake等连接器将直接指向DLF,可直接使用;如果集群中不包含Hive服务,可参见配置数据湖元数据自行配置。3.45.0及之后版本和5.11.0及之后版本的DataLake集群可在创建Trino集群时选择DLF元数据。
对于开启了DLF之后的集群,默认的hive等连接器将无法访问MetaStore。如果您有配置多Hive MetaStore、多MySQL的需求,或默认提供的连接器不包含您想要使用的服务时,您可以使用EMR Trino提供的5个占位连接器,即connector1~connector5,您可以选择其中任意一个,将其connector.name配置为hive或您所需要的连接器,再参考相应连接器的文档增添其他配置项,指向所需的服务地址。
Trino如何访问OSS?是否支持OSS-HDFS?
EMR默认安装了Jindo SDK,且支持免密。您可以使用OSS的标准访问方法直接访问OSS,也可查询存储于OSS上的Hive表。
EMR Trino支持OSS-HDFS。
如何访问Trino UI?如何理解Trino UI?
如果您的集群安装了Knox服务,可以使用Knox链接访问Trino UI,详情请参见Knox。
如果您的集群不包含Knox,可以使用公网链接,即访问{公网IP:HTTP端口}进入UI。其中,HTTP端口可从http-server.http.port配置中获取,默认为9090。如果无法进入,请确认9090端口的安全组已开放。
如果您的集群启用了高安全模式,默认的HTTP端口将无法使用。在确保网络权限的前提下,若需访问UI界面,请在Master节点组的config.properties文件中增加以下配置,然后使用原有方法进入UI界面。
web-ui.authentication.type=fixed
web-ui.user=trino
从Trino的UI中,可以获取到Trino最近执行的查询信息,包括SQL语句、执行计划等。Trino只会保存最近的不超过200条的查询,执行结果正常的查询很快就会被新的查询覆盖;异常的查询信息会保留的更久一些。可调整query.max-history配置(默认为100)以增加保存的SQL数量。
创建集群时没有选择Trino,想要添加Trino,需要注意什么?
对于DataLake集群,在集群剩余资源可以满足Trino使用时,直接添加即可。
对于Hadoop集群,需要确认集群是否有某些服务做过手动升级处理。如果存在这种情况,Trino创建完成后可能报错,此时可按照以下方式处理:
JindoSDK单独进行过升级时,尤其是进行过跨大版本的更新时,需重新执行Presto或Trino相关的升级脚本,手动将升级后的JindoSDK复制到Trino安装路径的对应连接器下。
对于EMR-3.39.1版本,请查看服务日志,其内容通常为找不到Delta相关的某个类。此时需要手动在各个节点下,将/opt/apps/ecm/service/deltalake/0.6.1-3.3/package/deltalake-0.6.1-3.3/presto-delta/delta-standalone-assembly-0.2.0.jar复制到/usr/lib/presto-current/plugin/delta路径下。
为什么我修改的配置没有生效?
Trino的配置文件位于/etc/emr/trino-conf中,请确认机器上的配置文件是否正确反映了控制台上的变化,是否有之前新增或修改的内容:
配置文件中没有之前新增或修改的内容:需要确认修改的配置是否进行了保存、是否执行了部署、配置修改范围是否符合需求。
重要如果某配置项单独修改过节点组或单个节点的配置,对应的集群默认配置将不再起作用。
配置文件中有之前新增或修改的内容:如果节点上的配置文件已经变成修改后的,请确认Trino的所有节点是否执行了重启,Trino必须在执行重启之后才会加载配置。
为什么我在查询卡住了?为什么我的Worker节点挂掉了?
如果发现报错信息为:Could not communicate with the remote task. The node may have crashed or be under too much load. This is probably a transient issue, so please retry your query in a few minutes.
或No handle resolver for connector: hive ... Unrecognized token 'io': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
,表示Worker节点负载太高已无法提供服务或Worker节点出现了自动重启。可能是某个Worker上的进程被系统终止,需要根据实际情况调整配置,尤其是内存相关配置,或限制并发请求数。
如何查看Trino日志?
Trino的日志文件默认保存在/mnt/disk1/log/trino/var/log/路径下。其中,输出及异常堆栈信息均在server.log文件中。
如果仅想查看某个查询的报错详情。可以在进入client时添加--debug
命令,此时即可打印异常堆栈。
Trino的Coordinator和Worker之间通过HTTP协议通信,当Coordinator节点出现HTTP返回异常时,说明报错可能出现在某台Worker节点上。此时,如果没有其他明显的异常信息,您需要逐一排查各Worker节点。
为什么查询不到数据或查询失败?
请按照以下方式排查:
使用Hive、Spark等其他引擎访问或查询数据。如果不能访问,需要确认数据源是否连通、数据是否完好。
如果仅Trino无法访问或无法执行查询,需要检查配置的元数据信息是否正确。
如果元数据正常,但查询一个有数据的表的结果为空,需要先检查您是否有数据访问权限。
如果数据所在的HDFS开启了proxyuser,Trino也需要开启hive.hdfs.impersonation.enabled配置。
如果开启了Ranger,请确认Ranger权限配置是否正确。
如果集群进行过扩容等操作,需要检查新增的节点组或节点是否具有访问相应文件的权限或能力。
为什么查询Hudi或Delta表时列的顺序错了?
需要检查Trino的hive.properties中的hive.parquet.use-columns-names配置项是否已置为true。
为什么新增一个配置后,重启Trino失败?
如果Server.log中包含了Error: Configuration property 'xxxxx' was not used
,则说明您新增配置的位置不正确,或缺乏必要的前置配置。Trino对配置项的校验非常严格,如果新增的配置不存在、配置写错,或配错文件,都会导致配置无法识别,Trino无法启动,所以请您仔细检查新增的配置是否正确,或进行回滚操作。
为什么使用Hive连接器查询Iceberg、Hudi或Delta Lake表时会报错Cannot query xxx table
?
针对Iceberg、Hudi和Delta Lake,Trino分别提供了单独的连接器。建议您使用各自的独立连接器来执行查询。如果您的作业必须使用Hive连接器,请使用提供的Table Redirection功能将查询转发到相应的独立连接器上。
例如,通过设置以下参数,您可以在Trino中配置Hive连接器,使其能够正确地使用相应的连接器来查询Iceberg、Delta Lake和Hudi表。
hive.iceberg-catalog-name=iceberg
hive.delta-lake-catalog-name=delta-lake
hive.hudi-catalog-name=hudi