我已經NoSuchMethodError在 Spark 專案中為此苦苦掙扎了一段時間,但一無所獲。目前,該專案使用 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 版。作業系統是大蘇爾,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)
uj5u.com熱心網友回復:
我終于能夠弄清楚這一點。根本原因是一個舊版本的 hadoop-core 被拉進來(1.2.1 而不是 2.6.5),它實際上沒有這個Configuration.getPassword()方法。我在設定了一個正確初始化 SparkContext 的測驗專案后發現了這一點,然后檢查了兩個專案中兩個 Configuration 類的源 jars(使用Configuration.class.getProtectionDomain().getCodeSource().getLocation().getPath())。
在使用 Maven 的依賴管理強制版本 2.6.5 并從本地 Maven 存盤庫中手動洗掉舊的 1.2.1 jar 后,它作業正常。
唯一我仍然不明白的是為什么hadoop-core沒有出現在 Maven 依賴樹中。否則,我會早點找到(可能)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/360156.html
標籤:爪哇 斯卡拉 阿帕奇火花 Hadoop 没有这种方法错误
