NoClassDefFoundError - hadoop/crypto/key/KeyProviderTokenIssuer && hadoop/fs/BatchListingOperations

52 篇文章 7 订阅
10 篇文章 0 订阅

一.引言

使用 spark.hadoopFile 读取 RCFile 时,报错 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/crypto/key/KeyProviderTokenIssuer 与 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/BatchListingOperations,修改依赖解决对应问题。

二.KeyProviderTokenIssuer

由于报错原因为 java.lang.NoClassDefFoundError 而不是 NoSuchMethod,所以基本排除是依赖冲突的高低版本的问题,如果不放心也可以使用编辑器进行全局搜索,这里全局搜索是没有该类的:

确实没有该类,提高 hadoop-common 消除该报错:

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

此时代码已有该类:

三.BatchListingOperations

修改 pom 后再次运行任务,再次提示 NoClassDefFoundError,根据上面的经验,这里判断还是没有依赖,所以再次修改 hadoop 版本。

hadoop-common 提高至 3.3.3:

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.3.3</version>
            <scope>provided</scope>
        </dependency>

再次运行任务没有问题:

 

四.判断与排查

1.如何判断没有依赖还是依赖冲突

一般情况下:

NoSuchMethod -> 依赖冲突

NoClassDefFoundError ->

A. 报错有自己代码的异常栈:对应 Class / Object 初始化失败

B. 报错均为官方异常栈:无对应依赖

2.最简单的确认方式

在 idea 或者 maven-tree 中查看报错对应依赖,如果有多个,大概率是依赖冲突,如果一个也搜不到则为无对应依赖,像这样快速查找,即可确定是单个,多个还是没有对应 class。

3.如果寻找对应版本

博主一般直接将报错贴至 Bing 国际版,像上面的错就可以直接得到版本。

 

4.最确切的版本定位

如果要寻找项目真实的版本,可以寻找底层代码的 GitHub,查看你当前调用版本 API 所在 branch 的 pom.xml,其内部的版本即为最确切的版本。例如之前在 Spark - ml.dmlc.xgboost4j / spark 版本匹配与 NoSuchMethodError 解决 一文中我们通过排查源码 pom.xml,才最终定位到当前 spark 版本与 xgboost 指定 spark 版本不一致导致依赖冲突。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值