无法在配置单元服务器上运行UDF

时间:2012-02-23 05:21:56

标签: hadoop user-defined-functions hive

我在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服务器表现不同的任何想法?

3 个答案:

答案 0 :(得分:9)

在玩了一段时间之后我通过将.class文件放入与其包匹配的目录结构中并将其从那里添加到.jar中来实现它。作为参考,我已经包括整个过程,包括编译和插入到配置单元。

  1. 我使用了UDF示例here
  2. 编译:{{1​​}}。 注意:CLASSPATH的定义如下:javac -classpath $CLASSPATH Lower.java,如here所述。
  3. 将.class文件复制到文件夹com / example / hive / udf /
  4. 使用此命令将其添加到jar中:CLASSPATH=$(ls $HIVE_HOME/lib/hive-serde-*.jar):$(ls $HIVE_HOME/lib/hive-exec-*.jar):$(ls $HADOOP_HOME/hadoop-core-*.jar)
  5. 验证包是否正确:jar -cf lower.jar com/example/hive/udf/Lower.class。您应该看到如下所示的行:jar -tf lower.jar
  6. 将jar导入hive。 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环境变量。