我正在尝试为hadoophive编写一个udf,它解析用户代理。以下代码在我的本地计算机上运行良好,但在hadoop上我得到:
org.apache.hadoop.hive.ql.metadata.hiveexception:无法在对象上执行方法public java.lang.string myudf.evaluate(java.lang.string)抛出org.apache.hadoop.hive.ql.metadata.hiveexceptionmyudf@64ca8bfb 参数为{all oc的myudf类的cupations:java.lang.string}大小为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();
}
}
我想到的事实应该是:
我正在用eclipse编译“export runnable jar file”,并将所需的库提取到生成的jar选项中
我正在上传这个带有hue的“fat jar”文件
我成功运行的最小工作示例: public String evaluate(String i) { return "hello" + i.toString()"; }
我想问题出在这个库的某个地方(下载自https://udger.com)我在用,但我不知道在哪里。
有什么建议吗?
谢谢,迈克尔
2条答案
按热度按时间nfeuvbwi1#
可能是一些事情。最好的办法是检查日志,但这里列出了一些您可以在一分钟内快速检查的事情。
jar不包含所有依赖项。我不确定eclipse如何构建一个可运行的jar,但它可能不包含所有依赖项。你能做到的
jar tf your-udf-jar.jar
看看里面有什么。你应该看看
com.decibel.uasparser
. 如果没有,就必须用适当的依赖关系构建jar(通常使用maven)。jvm的不同版本。如果使用jdk8编译并且集群运行jdk7,那么它也会失败
配置单元版本。有时,hiveapi会发生轻微的变化,足以导致不兼容。这里可能不是这样,但是请确保编译udf时使用集群中相同版本的hadoop和hive
你应该经常检查
info
调用后为nullparse()
看起来这个库使用了一个键,这意味着它实际上从一个在线服务(udger.com)获取数据,因此如果没有一个实际的键,它可能无法工作。更重要的是,图书馆在线更新,联系在线服务的每一个记录。这意味着,查看代码,它将为每个记录创建一个更新线程。您应该在构造函数中将代码更改为只执行一次,如下所示:以下是如何更改它:
但要确定,您必须查看日志…Yarn日志,但也可以查看提交作业的机器上的配置单元日志(可能在/var/log/hive中,但这取决于您的安装)。
deikduxw2#
这样的问题可能可以通过以下步骤来解决:
超越方法
UDF.getRequiredJars()
,使其返回hdfs
文件路径列表哪些值由您将以下_lib文件夹放入hdfs的位置决定。注意,这个列表正好包含每个jar的完整hdfs路径字符串,例如hdfs://yourcluster/some_path/_lib/some.jar
导出您的udf
按照“runnable jar file exporting wizard”(选择“copy required libraries into a sub folder next to the generated jar”)编写代码。此步骤将生成.jar和.jar旁边的lib文件夹\u lib根据步骤0中的代码,将.jar和文件夹_lib放入hdfs文件系统。
创建一个udf使用:add jar${the .jar hdfs path};将函数创建为$}自定义函数类的限定名};
试试看。我测试了一下,它就成功了