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

jwe*_*gan 8 hadoop hive user-defined-functions

我在thrift服务器模式下运行配置单元.我在jar文件中有一个UDF,我试图通过运行来使用它

add jar <path to jar>
create temporary function func_name as 'com.test.udf.UDF_CLASS'
Run Code Online (Sandbox Code Playgroud)

但是,当我运行create temporary function命令时,我收到一个错误

查询返回非零代码:9,原因:FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.FunctionTask返回代码1

我已经检查了jar的名称和路径以及运行hive服务器的用户是否具有访问jar的所有正确权限.奇怪的是,如果我在CLI模式下运行配置单元并运行完全相同的命令,那么一切正常.关于为何hive CLI可能与hive thrift服务器表现不同的任何想法?

Tyl*_*ler 9

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

  1. 我在这里使用了UDF示例
  2. 编译它: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)作为描述在这里.
  3. 将.class文件复制到文件夹com/example/hive/udf /
  4. 使用此命令将其添加到jar中: jar -cf lower.jar com/example/hive/udf/Lower.class
  5. 确认包看起来正确:jar -tf lower.jar.你应该看到这样一条线:com/example/hive/udf/Lower.class.
  6. 将jar导入hive. add jar lower.jar; create temporary function my_lower as 'com.example.hive.udf.Lower';

  • 也适合我:)第一步的链接现在已经破了,我认为应该指向:https://cwiki.apache.org/confluence/display/Hive/HivePlugins (2认同)

jwe*_*gan 3

使用以下步骤修复了该问题:

1)将每个 UDF jar 放在 /usr/lib/hive/auxlib 中

2) 为 hive.aux.jars.path 属性指定 hive-site.xml 中每个 jar 的路径(例如:file:///usr/lib/hive/auxlib/jar1.jar,file:///usr /lib/hive/auxlib/jar2.jar)

3)创建一个脚本,向hive服务器发出thrift请求,在hive服务器启动后为每个UDF运行create temp function func_name as 'com.test.udf.ClassName'

编辑:对于 Hive 0.9,无论我做什么,Hiveserver 都无法在 auxlib 目录中找到 jar。为了让它在 Hiveserver 0.9 上工作,我必须将 jar 转储到 Hive 类路径指定的目录中。