本文为您介绍阿里云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
步骤三:删除UDF
直接删除plugin目录下对应名称的整个目录,指定UDF包名即可删除UDF,并重新加载函数列表。
语法为
DROP JAR xxxxxx
。
说明 语法中的
xxxxxx
为上传的文件名,同时也是Trino读取UDF plugin的路径名。
删除语句不需要加引号,且无论通过方式一还是方式二上传,删除时均不需要加
jar
后缀。示例如下:
drop jar udfjar;
drop jar udfdir;