NoSuchMethodError:org.apache.hadoop.conf.Configuration.getPassword

Posted

技术标签:

【中文标题】NoSuchMethodError:org.apache.hadoop.conf.Configuration.getPassword【英文标题】:NoSuchMethodError: org.apache.hadoop.conf.Configuration.getPassword 【发布时间】:2021-12-13 09:59:16 【问题描述】:

我已经在 Spark 项目中与这个 NoSuchMethodError 苦苦挣扎了一段时间,但没有得到任何结果。目前,该项目使用 SparkNLP 3.3.0 和 Spark-Core/SparkMLLib 3.1.2 在本地运行,两者都使用 Scala 2.12.4。 Hadoop 3.2.0 通过 spark-core 作为传递依赖引入。

到目前为止我所尝试的:

通过单步执行代码检查该方法是否确实存在 跨所有依赖项验证统一的 Scala 版本 验证 spark 和 hadoop 版本是否始终相同(使用 maven dep 树和强制插件) 从本地 .m2 目录中手动删除其他版本的 Hadoop

代码从一个可执行 JAR 运行,该 JAR 将其他 jar 拉入运行时提供的类路径。 Java 版本为 1.8.0_282。 Maven 是 3.6.3 版。操作系统是 Big Sur,11.6 (M1)。

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.getPassword(Ljava/lang/String;)[C
    at org.apache.spark.SSLOptions$.$anonfun$parse$8(SSLOptions.scala:188)
    at scala.Option.orElse(Option.scala:289)
    at org.apache.spark.SSLOptions$.parse(SSLOptions.scala:188)
    at org.apache.spark.SecurityManager.<init>(SecurityManager.scala:98)
    at org.apache.spark.SparkEnv$.create(SparkEnv.scala:252)
    at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:189)
    at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:277)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:458)
    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2672)
    at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$2(SparkSession.scala:945)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:939)
    [...]
    at com.mymainpackage.Main.main(Main.java:157)

【问题讨论】:

有趣的是,当我更改 IntelliJ 中的模块设置以显式添加 Scala 2.12.4 库时,错误变为 Exception in thread "main" java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V。更有趣的是:再次删除 Scala 库,不会恢复到原来的错误 PPS:全面更新到 Scala 2.12.10 也无济于事。两个 NoSuchMethodError 仍然存在。 你如何运行你的代码?通过spark-submit? 不,都是本地的。 郑重声明:将所有内容降级到 Scala 2.11 无济于事。仍然得到Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.getPassword(Ljava/lang/String;)[C(另一个NoSuchMethodError,但是现在已经消失了) 【参考方案1】:

我终于能够弄清楚这一点。 根本原因是引入了旧版本的 hadoop-core(1.2.1 而不是 2.6.5),它实际上没有 Configuration.getPassword() 方法。我在设置了一个测试项目后发现了这一点,其中 SparkContext 已正确初始化,然后检查了两个项目中两个配置类的源 jar(使用Configuration.class.getProtectionDomain().getCodeSource().getLocation().getPath())。

在使用 Maven 的依赖管理强制版本 2.6.5 并从本地 Maven 存储库手动删除旧的 1.2.1 jar 后,它工作正常。

我唯一不明白的是为什么 hadoop-core 没有出现在 Maven 依赖树中。否则,我会更快(可能)找到。

【讨论】:

以上是关于NoSuchMethodError:org.apache.hadoop.conf.Configuration.getPassword的主要内容,如果未能解决你的问题,请参考以下文章

NoSuchMethodError(NoSuchMethodError:方法'[]'在null上被调用。接收者:null尝试调用:[](“title”))

NoSuchMethodError:null 上的无效成员:'length'

NoSuchMethodError,小部件库捕获的异常

NoSuchMethodError - 颤振[重复]

hadoop

接缝测试 NoSuchMethodError