无法在配置单元服务器上运行UDF
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在配置单元服务器上运行UDF相关的知识,希望对你有一定的参考价值。
我在thrift服务器模式下运行配置单元。我在jar文件中有一个UDF,我试图通过运行来使用它
add jar <path to jar>
create temporary function func_name as 'com.test.udf.UDF_CLASS'
但是,当我运行create temporary function命令时,我收到一个错误
查询返回非零代码:9,原因:FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.FunctionTask返回代码1
我已经检查了jar的名称和路径以及运行hive服务器的用户是否具有访问jar的所有正确权限。奇怪的是,如果我在CLI模式下运行配置单元并运行完全相同的命令,那么一切正常。关于为什么hive CLI可能与hive thrift服务器表现不同的任何想法?
在玩了一段时间之后,我通过将.class文件放入与其包匹配的目录结构中并将其从那里添加到.jar中来实现它。作为参考,我已经包括整个过程,包括编译和插入到配置单元中。
- 我使用了UDF示例here
- 编译它:
javac -classpath $CLASSPATH Lower.java
。注意:CLASSPATH的定义如下:CLASSPATH=$(ls $HIVE_HOME/lib/hive-serde-*.jar):$(ls $HIVE_HOME/lib/hive-exec-*.jar):$(ls $HADOOP_HOME/hadoop-core-*.jar)
,如here所述。 - 将.class文件复制到文件夹com / example / hive / udf /
- 使用此命令将其添加到jar中:
jar -cf lower.jar com/example/hive/udf/Lower.class
- 确认包看起来正确:
jar -tf lower.jar
。你应该看到这样的一行:com/example/hive/udf/Lower.class
。 - 将jar导入hive。
add jar lower.jar; create temporary function my_lower as 'com.example.hive.udf.Lower';
使用以下步骤解决了该问题:
1)将每个UDF jar放在/ usr / lib / hive / auxlib中
2)在hive-site.xml中为hive.aux.jars.path属性指定每个jar的路径(例如:file:///usr/lib/hive/auxlib/jar1.jar,file:/// usr /lib/hive/auxlib/jar2.jar)
3)创建一个脚本,向hive服务器发出一个thrift请求,在hive服务器启动后为每个UDF运行创建临时函数func_name为'com.test.udf.ClassName'
编辑:对于Hive 0.9,无论我做什么,Hiveserver都找不到auxlib目录中的jar。为了让它在Hiveserver 0.9上工作,我不得不将jar转储到Hive的类路径指定的目录中。
您也可以将--auxpath选项传递给hive命令hive --auxpath /path-to-/hive-examples.jar
要么
通过设置HIVE_AUX_JARS_PATH环境变量。
以上是关于无法在配置单元服务器上运行UDF的主要内容,如果未能解决你的问题,请参考以下文章