hadoop配置单元udf

yhxst69z  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(512)

我正在尝试为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)我在用,但我不知道在哪里。
有什么建议吗?
谢谢,迈克尔

nfeuvbwi

nfeuvbwi1#

可能是一些事情。最好的办法是检查日志,但这里列出了一些您可以在一分钟内快速检查的事情。
jar不包含所有依赖项。我不确定eclipse如何构建一个可运行的jar,但它可能不包含所有依赖项。你能做到的
jar tf your-udf-jar.jar
看看里面有什么。你应该看看 com.decibel.uasparser . 如果没有,就必须用适当的依赖关系构建jar(通常使用maven)。
jvm的不同版本。如果使用jdk8编译并且集群运行jdk7,那么它也会失败
配置单元版本。有时,hiveapi会发生轻微的变化,足以导致不兼容。这里可能不是这样,但是请确保编译udf时使用集群中相同版本的hadoop和hive
你应该经常检查 info 调用后为null parse() 看起来这个库使用了一个键,这意味着它实际上从一个在线服务(udger.com)获取数据,因此如果没有一个实际的键,它可能无法工作。更重要的是,图书馆在线更新,联系在线服务的每一个记录。这意味着,查看代码,它将为每个记录创建一个更新线程。您应该在构造函数中将代码更改为只执行一次,如下所示:
以下是如何更改它:

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中,但这取决于您的安装)。

deikduxw

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};将函数创建为$}自定义函数类的限定名};
试试看。我测试了一下,它就成功了

相关问题