本文为您介绍阿里云 EMR Trino 如何动态加载和更新自定义函数(UDF)。
背景信息
EMR-3.39.1 之前版本和 EMR-5.5.0 之前版本的 Trino 新增 UDF 需要把 JAR 包上传到所有节点,然后重启服务器生效,此方式不是很方便。在 on ACK 场景下,如果需要使用新的 UDF,还需重新打镜像,此方式不太友好。因此 EMR-3.39.1 及之后版本和 EMR-5.5.0 及之后版本的阿里云 EMR Trino 实现了 UDF 的动态加载和删除。
使用限制
EMR-3.39.1 及后续版本、EMR-5.5.0 及后续版本的 Hadoop 集群或选择了 Trino 的集群,支持 UDF 的动态加载和删除。
注意事项
-
如果本文示例中的
xxxxxx
的内容为现有连接器,例如 hive 、 mysql 等,执行 DROP 命令会直接删除该连接器目录下的所有内容,且无法恢复,因此请谨慎操作。 -
集群扩容时,扩容新增的节点不含上传到原有节点的 UDF 包,因此在扩容前需先执行 DROP 命令,扩容完成后再重新执行 ADD 命令。
-
如果 HDFS 或 OSS 访问失败,请尝试使用
hadoop fs -ls
命令,确认集群的每个节点能否直接访问到对应文件。如果某个 Worker 节点无法访问,可以在对应 Worker 节点的 server.log 日志文件中查找原因。
操作流程
步骤一:环境准备
将 UDF 对应的 JAR 包文件放在对应的文件系统中。
目前 UDF 文件支持以下两种方式:
-
方式一:将 UDF 的全部内容打成一个 JAR 包(例如, udfjar.jar ),上传到文件系统中。如果 OSS 属于其他账号,或使用的是 ACK 集群,则需保证该 JAR 包有公开的读权限。
重要-
包名不可与现有连接器或 UDF 重名。
-
建议包名只包含字母数字,否则可能出现不识别的情况。
-
Trino 无法直接使用 Presto 的 UDF,需修改包名后重新编译,否则可能导致添加失败。
-
-
方式二:如果 UDF 依赖多个 JAR 包,且不想打成一个包,可以将 UDF 的所有 JAR 包上传到同一个目录下(例如, udfdir ),再将该目录完整上传到文件系统中。
重要-
目录名不可与现有连接器或 UDF 重名。
-
目录下尽量不要有无关内容。
-
目录需要配置权限。
-
步骤二:添加 UDF
-
启动客户端,连接 Trino,并输入以下指令添加 UDF 包。
-
通过 SSH 方式登录集群,详情请参见 登录集群 。
-
执行如下命令,进入 Trino 控制台。
trino --server master-1-1:9090
-
-
执行如下命令,添加 UDF。
此操作会在 Trino 安装路径的 plugin 目录下新建一个文件夹,然后将路径所对应的文件上传到新建的文件夹下,并刷新当前函数列表。
语法为
add jar "xxxxxx" ;
。说明若在执行添加 UDF 时报错,您可以在 Worker 节点的
/mnt/disk1/log/trino/var/log/server.log
日志文件中查找原因。-
如果是 步骤一:环境准备 中的方式一,则对应命令如下。
add jar "oss://路径/udfjar.jar";
-
如果是 步骤一:环境准备 中的方式二,则对应命令如下。
add jar "oss://路径/udfdir";
此时 Trino 能够识别出要上传的是一个目录,并将目录下的所有内容下载到集群上。
-
如果是将 UDF 文件保存在 HDFS 上,则对应命令如下。
add jar "hdfs://xxxxxx";
-
如果是将 UDF 文件保存在本地文件系统上,则对应命令如下。
add jar "file:///xxxxxx";
重要在使用本地文件系统时,需要将 UDF 文件上传到 Trino 运行的所有节点的对应路径下,
file
后面需要三个正斜线(/)。
-
步骤三:删除 UDF
直接删除 plugin 目录下对应名称的整个目录,指定 UDF 包名即可删除 UDF,并重新加载函数列表。
语法为
DROP JAR xxxxxx ;
。
语法中的
xxxxxx
为上传的文件名,同时也是
Trino
读取
UDF plugin
的路径名。
删除语句不需要加引号,且无论通过方式一还是方式二上传,删除时均不需要加
jar
后缀。示例如下:
-
drop jar udfjar;
-
drop jar udfdir;