V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linuxchild
V2EX  ›  Java

HIVE UDF 运行提示 Java .lang.NoClassDefFoundError 错误

  •  
  •   linuxchild · 2017-09-19 18:11:37 +08:00 · 5056 次点击
    这是一个创建于 2647 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 Java 写了一个 UDF,然后添加到 Hive 临时函数,运行下面语句可以正常使用

    select func_name(xxx) from table_name where xx 
    

    但是假如使用下面语句就会提示 java.lang.NoClassDefFoundError 错误

    select count(*) from table_name where func_name(xxx)=xxx
    
    或
    
    select count(func_name(xxx)) from table_name
    

    错误提示如下:

    Caused by: java.lang.RuntimeException: Map operator initialization failed
            at org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor.init(MapRecordProcessor.java:293)
            at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:171)
            ... 14 more
    Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
            at org.apache.hadoop.hive.ql.exec.FilterOperator.initializeOp(FilterOperator.java:73)
            at org.apache.hadoop.hive.ql.exec.vector.VectorFilterOperator.initializeOp(VectorFilterOperator.java:71)
            at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:355)
            at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:504)
            at org.apache.hadoop.hive.ql.exec.Operator.initializeChildren(Operator.java:457)
            at org.apache.hadoop.hive.ql.exec.Operator.initialize(Operator.java:365)
            at org.apache.hadoop.hive.ql.exec.MapOperator.initializeMapOperator(MapOperator.java:498)
            at org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor.init(MapRecordProcessor.java:262)
            ... 15 more
    Caused by: java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Class.java:348)
            at org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.getUdfClass(GenericUDFBridge.java:130)
            at org.apache.hadoop.hive.ql.exec.FunctionRegistry.isStateful(FunctionRegistry.java:1352)
            at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator.<init>(ExprNodeGenericFuncEvaluator.java:110)
            at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluatorFactory.get(ExprNodeEvaluatorFactory.java:51)
            at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator.<init>(ExprNodeGenericFuncEvaluator.java:100)
            at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluatorFactory.get(ExprNodeEvaluatorFactory.java:51)
            at org.apache.hadoop.hive.ql.exec.FilterOperator.initializeOp(FilterOperator.java:65)
            ... 22 more
            
    

    开始是 MapReduce 引擎,后来尝试换到 Tez,都是同样到错误,哪位遇到过这种问题,求解答。

    第 1 条附言  ·  2017-09-20 11:54:26 +08:00

    UDF的jar包使用下面命令生成的:

    javac  -classpath xxx.jar:yyy.jar zzz.java
    
    jar cvf zzz.jar zzz.class
    
    

    生成的jar包没有包含用到的 xxx.jar yyy.jar这些第三方包

    第 2 条附言  ·  2017-09-20 15:46:12 +08:00
    eclipse 打包了用的的 jar 包,目前看来也不行…
    7 条回复    2017-09-23 02:09:30 +08:00
    qiyuey
        1
    qiyuey  
       2017-09-19 19:29:20 +08:00
    检查依赖是否缺失
    oaix
        2
    oaix  
       2017-09-19 21:33:15 +08:00
    是不是第三方的包没打到 jar 里面?
    如果用 gradle,使用 https://github.com/johnrengelman/shadow 这个插件打包。
    如果用 maven,用这个: https://github.com/johnrengelman/shadow
    linuxchild
        3
    linuxchild  
    OP
       2017-09-20 11:46:52 +08:00
    @oaix

    第三方的包的确是没有打到 jar 包中,不过 jar 包内存的是编译后的 class 文件,这样有影响么?
    linuxchild
        4
    linuxchild  
    OP
       2017-09-20 11:49:11 +08:00
    @oaix 同时编译的时候已经指定了使用的 jar 包
    linuxchild
        5
    linuxchild  
    OP
       2017-09-20 11:50:57 +08:00
    @qiyuey 依赖缺失会存在部分命令可执行的情况么?刚接触 Hive 和 Java 这些,有点迷糊
    oaix
        6
    oaix  
       2017-09-20 20:38:17 +08:00
    @linuxchild 所以你需要使用我上面说的插件来把第三方包都打到 jar 包里面。
    linuxchild
        7
    linuxchild  
    OP
       2017-09-23 02:09:30 +08:00
    @oaix 话说使用 eclipse 打了一个 jar 包,也不行 - -
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3603 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:46 · PVG 08:46 · LAX 16:46 · JFK 19:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.