我在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
我已经检查过这个名字&amp; jar的路径以及运行hive服务器的用户具有访问jar的所有正确权限。奇怪的是,如果我在CLI模式下运行配置单元并运行完全相同的命令,那么一切正常。有关为什么hive CLI可能与hive thrift服务器表现不同的任何想法?
答案 0 :(得分:9)
在玩了一段时间之后我通过将.class文件放入与其包匹配的目录结构中并将其从那里添加到.jar中来实现它。作为参考,我已经包括整个过程,包括编译和插入到配置单元。
javac -classpath $CLASSPATH Lower.java
,如here所述。 CLASSPATH=$(ls $HIVE_HOME/lib/hive-serde-*.jar):$(ls $HIVE_HOME/lib/hive-exec-*.jar):$(ls $HADOOP_HOME/hadoop-core-*.jar)
jar -cf lower.jar com/example/hive/udf/Lower.class
。您应该看到如下所示的行:jar -tf lower.jar
。com/example/hive/udf/Lower.class
答案 1 :(得分:3)
使用以下步骤解决了问题:
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的类路径指定的目录中。
答案 2 :(得分:0)
您也可以将--auxpath选项传递给hive命令 hive --auxpath /path-to-/hive-examples.jar
或
通过设置HIVE_AUX_JARS_PATH环境变量。