【问题标题】:Unable to run UDF on hive server无法在配置单元服务器上运行 UDF
【发布时间】:2012-03-13 12:55:31
【问题描述】:

我在节俭服务器模式下运行 hive。我在一个 jar 文件中有一个 UDF,我试图通过运行来使用它

add jar <path to jar>
create temporary function func_name as 'com.test.udf.UDF_CLASS'

但是,当我运行创建临时函数命令时出现错误

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

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

【问题讨论】:

    标签: hadoop user-defined-functions hive


    【解决方案1】:

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

    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';

    【讨论】:

    • 不知道为什么有人对此投了反对票。我遇到了同样的问题,这对我有用...在 AWS EMR 上使用 hive 0.11.0
    • 对我也有用 :) 第一步中的链接现在坏了,我认为它应该指向:cwiki.apache.org/confluence/display/Hive/HivePlugins
    【解决方案2】:

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

    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 服务器发出节俭请求,以便在 hive 服务器启动后为每个 UDF 创建临时函数 func_name as 'com.test.udf.ClassName'

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

    【讨论】:

      【解决方案3】:

      您也可以通过将 --auxpath 选项传递给 hive 命令来实现 hive --auxpath /path-to-/hive-examples.jar

      通过设置 HIVE_AUX_JARS_PATH 环境变量。

      【讨论】:

      • 这两者都不能与 0.7.0 版(我正在使用的版本)的 Thrift Hive 服务器一起使用,因为 0.7.0 只接受 HIVE_PORT 作为命令行选项,而不是标准的 HIVE_OPTS。 Hive CLI 已经支持你提到的两种方式,但我认为只在 0.8 中添加了对在 hiveserver 模式下运行的方式的支持。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2014-05-04
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多