gpt4 book ai didi

java - 带有外部库的 Hadoop Hive UDF

转载 作者:可可西里 更新时间:2023-11-01 15:30:25 27 4
gpt4 key购买 nike

我正在尝试为 Hadoop Hive 编写一个 UDF,用于解析用户代理。以下代码在我的本地机器上运行良好,但在 Hadoop 上我得到:

org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public java.lang.String MyUDF .evaluate(java.lang.String) throws org.apache.hadoop.hive.ql.metadata.HiveException on object MyUDF@64ca8bfb of class MyUDF with arguments {All Occupations:java.lang.String} of size 1',

代码:

import java.io.IOException;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.*;
import com.decibel.uasparser.OnlineUpdater;
import com.decibel.uasparser.UASparser;
import com.decibel.uasparser.UserAgentInfo;

public class MyUDF extends UDF {

public String evaluate(String i) {
UASparser parser = null;
parser = new UASparser();
String key = "";
OnlineUpdater update = new OnlineUpdater(parser, key);
UserAgentInfo info = null;
info = parser.parse(i);
return info.getDeviceType();
}
}

我想到的事实我应该提到:

  • 我正在使用“导出可运行的 jar 文件”使用 Eclipse 进行编译,并将所需的库提取到生成的 jar 选项中

  • 我正在使用 Hue 上传这个“fat jar”文件

  • 我设法运行的最小工作示例:

    public String evaluate(String i) {
    返回“你好”+ i.toString()”;
    }

  • 我想问题出在我正在使用的那个库(从 https://udger.com 下载)附近,但我不知道在哪里。

有什么建议吗?

谢谢,米哈尔

最佳答案

这可能是一些事情。最好的办法是检查日志,但这里列出了一些您可以在一分钟内快速检查的内容。

  1. jar 不包含所有依赖项。我不确定 eclipse 如何构建可运行的 jar,但它可能不包括所有依赖项。你可以做

    jar tf your-udf-jar.jar

查看包含的内容。您应该看到来自 com.decibel.uasparser 的内容。如果没有,您必须使用适当的依赖项构建 jar(通常您使用 maven 来完成)。

  1. JVM 的不同版本。如果用jdk8编译,集群运行jdk7,也会失败

  2. hive 版本。有时 Hive API 稍有变化,足以不兼容。这里可能不是这种情况,但请确保针对集群中的相同版本的 hadoop 和 hive 编译 UDF

  3. 在调用 parse()

  4. 后,您应该始终检查 info 是否为 null
  5. 看起来该库使用了一个 key ,这意味着它实际上是从在线服务 (udger.com) 获取数据,因此如果没有实际的 key ,它可能无法工作。更重要的是,图书馆在线更新,为每条记录联系在线服务。这意味着,查看代码,它将为每条记录创建一个更新线程。您应该将代码更改为仅在构造函数中执行一次,如下所示:

更改方法如下:

public class MyUDF extends UDF {
UASparser parser = new UASparser();

public MyUDF() {
super()
String key = "PUT YOUR KEY HERE";
// update only once, when the UDF is instantiated
OnlineUpdater update = new OnlineUpdater(parser, key);
}

public String evaluate(String i) {
UserAgentInfo info = parser.parse(i);
if(info!=null) return info.getDeviceType();
// you want it to return null if it's unparseable
// otherwise one bad record will stop your processing
// with an exception
else return null;
}
}

但要确定,您必须查看日志... yarn 日志,但您也可以查看您提交作业的机器上的配置单元日志(可能在/var/log/hive但这取决于您的安装)。

关于java - 带有外部库的 Hadoop Hive UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34435052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com