1 概述
本文档说明了在TDH集群部署UDF的规范化操作流程,方便大家在日后的实施工作中提高效率。
(1)编写自定义UDF函数:
(2)将jar包传到hdfs上:
- 创建使用UDF:
create permanent function getuuid as 'com.GetUUID' using jar 'hdfs:/user/hive/inceptor-v1dsq/user/hive/udf/getuuid.jar'
2 部署UDF步骤及通用命令
步骤 | 通用命令 | 备注 |
查看已存在jar包 | LIST JAR; | |
添加jar包 | ADD JAR[S] <local_or_hdfs_path>; | Local_path是Inceptor server节点的路径。保证hive用户对jar所在的目录有读权限。 |
创建临时UDF | CREATE TEMPORARY FUNCTION [<db_name>.]<function_name> AS <class_name>; | 临时UDF在Inceptor重启后失效。 如果需要更新临时UDF,需要重启Inceptor重新创建该临时UDF。 |
验证临时UDF | SELECT [<db_name>.]<function_name>() FROM SYSTEM.DUAL; | |
创建永久UDF | CREATE PERMANENT FUNCTION [<db_name>.]<function_name> AS <class_name>; | 如果Inceptor不在local mode,那么资源的地址也必须是非本地URI,比如HDFS地址。 |
验证永久UDF | SELECT [<db_name>.]<function_name>() FROM SYSTEM.DUAL; |
3 数据中心部署UDF实例
3.1 列表已经装载的用户自定义的扩展 jar 包
LIST JAR;
3.2 添加jar包
ADD jar hdfs:/tmp/jar/UDFSubjectData.jar;
3.3 创建临时UDF
CREATE TEMPORARY FUNCTION cpdl_raw.UDFIsValidNameFunc AS 'cpdc.subjectdata.udf.UDFIsValidCertTypeFunc';
3.4 验证临时UDF
SELECT cpdl_raw.UDFIsValidNameFunc('张三') FROM system.dual;
3.5 创建永久UDF
CREATE PERMANENT FUNCTION cpdl_raw.UDFIsValidIdCardNoFunc AS 'cpdc.subjectdata.udf.UDFIsValidIdCardNoFunc';
3.6 验证永久UDF
SELECT cpdl_raw.UDFIsValidIdCardNoFunc('110101820123987') FROM system.dual;
SELECT cpdl_raw.UDFIsValidIdCardNoFunc('11010119820123987X') FROM system.dual;
4 注意事项
4.1 更新永久函数
生产中大多使用永久UDF,当永久UDF需要更新时,4.X版本TDH执行的操作步骤是:
- 删除永久UDF
- 重启Inceptor
- 创建新的永久UDF
如果暂时不能重启,需要将jar包名、类名、函数名全部修改重建。
5.X版本的TDH执行的操作步骤是:
- 删除永久UDF
- 创建新的永久UDF
4.2 多个Inceptor共用一个metastore
当存在多个Inceptor server共用一个metastore时,在一个server下创建UDF,需要将其他Inceptor server重启才能查看、使用UDF。
- 常见错误
5.1 找不到指定类
解决办法:
检查类的名称、包路径是否正确。
5.2 JDK版本不匹配
Server log显示:
解决办法:
重建工程,将相关包和代码复制,重新打jar包,注意JDK版本要和TDH集群匹配。