Hive Udf因JDK版本问题上传失败,修改后不生效

打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Hive版本2.1.1
以下SQL是通过beeline访问Hive执行的
创建Hive全局UDF函数

1、上传jar包

1.1 上传到HDFS上

上传UDF jar(hive-udf-1.0-SNAPSHOT.jar)到hdfs上 /tmp/udf 目录
  1. hdfs dfs -put ./hive-udf.jar /tmp/udf
复制代码

1.2 上传到minio上

(1)可以利用mc下令上传文件到minio服务上
添加minio服务别名:mc config host add <别名> http://localhost:9000 <用户> <密码> --api s3v4
上传文件 :mc cp <当地文件路径> <别名>/<桶名称>/<长途文件路径>
(2)可以利用minio的管控页面

需要将桶的权限设置为public
2、创建UDF函数

2.1 利用hdfs上udf文件

  1. create function database.strUpper as 'com.xxxx.HiveUdfTest1' using jar 'hdfs://hdfs01:8020/tmp/udf/hive-udf-1.0-SNAPSHOT.jar';
复制代码
2.2 利用minio上udf文件

  1. create function database.strUpper as 'com.xxxx.HiveUdfTest1' using jar 'http://minioIp:9001/path/hive-udf-1.0-SNAPSHOT.jar';
复制代码
3、第一个问题:JDK版本不匹配


因为编译的JDK版本比Hive运行的jdk版本高
于是在代码的pom里将编译jdk改成8

编译后还是原来的jar(hive-udf-1.0-SNAPSHOT.jar)名称重新上传到hdfs的/tmp/udf目录下

还是报上面的错误,反复尝试多次依然报上面的错
开始怀疑是jar编译没有生效,反编译后看jar内容确实是已经更新后
4、第二个问题:beeline会话缓存jar包

(1)首先验证:修改类名后还能不能找到新class类

将类名HiveUdfTest1改成HiveUdfTest2,重新编译再上传到hdfs的/tmp/udf目录下
再执行上述创建udf函数的下令,不一样的报错:

验证了hive确实将jar包缓存了,导致后面再更新的jar都没有生效
这里有点不明白是,缓存的jar包名称还是jar路径?
(2)再次验证:是否是缓存jar路径

修改上传的hdfs路径 /tmp/udf1目录

执行创建udf函数下令,还是报错找不到类

最终确定:缓存jar包名称
(3)在同一个session会话会存在缓存udf包资源

可以通过修改jar包名重新上传
修改上传hdfs的jar包名称

执行创建udf函数下令,乐成


可以退出session会话重新开启新的会话

退出beeline  -- ctrl + C
./beeline 重新进入
5、beeline缓存函数时

假如是遇到function函数被删掉但是show functions时显示存在时:
执行 reload function 重新加载函数
再show function时应该就看不到已删除的函数

6、先删除UDF资源包,再删除函数,无效


所以要先删自定义函数,再删除UDF资源包
7、总结:

udf函数问题以及解决方案可以在批评区留言

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表