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

2017-09-19 18:11:37 +08:00
 linuxchild

使用 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,都是同样到错误,哪位遇到过这种问题,求解答。

4943 次点击
所在节点    Java
7 条回复
qiyuey
2017-09-19 19:29:20 +08:00
检查依赖是否缺失
oaix
2017-09-19 21:33:15 +08:00
是不是第三方的包没打到 jar 里面?
如果用 gradle,使用 https://github.com/johnrengelman/shadow 这个插件打包。
如果用 maven,用这个: https://github.com/johnrengelman/shadow
linuxchild
2017-09-20 11:46:52 +08:00
@oaix

第三方的包的确是没有打到 jar 包中,不过 jar 包内存的是编译后的 class 文件,这样有影响么?
linuxchild
2017-09-20 11:49:11 +08:00
@oaix 同时编译的时候已经指定了使用的 jar 包
linuxchild
2017-09-20 11:50:57 +08:00
@qiyuey 依赖缺失会存在部分命令可执行的情况么?刚接触 Hive 和 Java 这些,有点迷糊
oaix
2017-09-20 20:38:17 +08:00
@linuxchild 所以你需要使用我上面说的插件来把第三方包都打到 jar 包里面。
linuxchild
2017-09-23 02:09:30 +08:00
@oaix 话说使用 eclipse 打了一个 jar 包,也不行 - -

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/392024

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX