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”))