无法在配置单元服务器上运行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中来实现它。作为参考,我已经包括整个过程,包括编译和插入到配置单元中。

  1. 我使用了UDF示例here
  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),如here所述。
  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';
另一答案

使用以下步骤解决了该问题:

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的主要内容,如果未能解决你的问题,请参考以下文章

运行 sql 时配置单元 UDF 如何运行?

无法在配置单元中添加 UDF

更新配置单元 UDF 的 jar

无法在 UDF 的单元格中写入字符串

我们可以在 Spark 中编写配置单元查询吗?UDF

如何将配置从配置单元脚本传递到 UDF