簡體   English   中英

Apache Spark:Classloader在罐子中找不到classDef

[英]Apache Spark: Classloader cannot find classDef in the jar

我在本地模式下的Apache Spark中運行作業,它將其結果保存到s3a文件系統中。 由於Hadoop 2.6沒有s3a://實現(或s3://,s3n://)。 我打包了一個包含jaroop-aws 2.6.0所有傳遞依賴項的uber jar,並將其與我的主要工作的jar一起提交。

但是,當我使用以下簡約代碼進行測試時:

sc.parallelize(1 to 100).saveAsTextFile("s3a://***/test10/")

編譯器在我的第一次運行中給了我這個錯誤:

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at com.amazonaws.auth.AWSCredentialsProviderChain.<clinit>(AWSCredentialsProviderChain.java:41)
    at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:112)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2596)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
    at org.apache.spark.SparkHadoopWriter$.createPathFromString(SparkHadoopWriter.scala:170)
    at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:953)
    at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:863)
    at org.apache.spark.rdd.RDD.saveAsTextFile(RDD.scala:1290)

而且,如果我嘗試再次運行,它會給我這個錯誤:

java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.auth.AWSCredentialsProviderChain
    at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:112)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2596)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
    at org.apache.spark.SparkHadoopWriter$.createPathFromString(SparkHadoopWriter.scala:170)
    at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:953)
    at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:863)
    at org.apache.spark.rdd.RDD.saveAsTextFile(RDD.scala:1290)

奇怪的是:LogFactory和AWSCredentialsProviderChain都在我提到的超級jar中。 我還檢查了其他jar,包括工作人員上的spark庫和我的主要工作的jar(已部署到spark / worker目錄),並可以確認沒有一個jar具有相同名稱的類。 因此,它決不是一個地獄問題(此外,在這種情況下,拋出的錯誤應該是Property / MethodNotFoundError)。 您是否有任何線索可能會發生什么以及如何解決?

我之前遇到過類似的問題,我的解決方案是在運行spark-submit時將uber jar本身添加到--driver-class-path中。 您的uber-jar不是由JVM直接執行的。 而是由Spark的某種驅動程序包裝程序運行。 將uber jar添加到驅動程序的類路徑似乎沒有必要,但有時可以解決一些奇怪的NoClassDefFoundError。 我不確定是否可以解決您的問題,但是值得嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM