Apache Spark:Classloader在jar中找不到classDef

时间:2015-05-24 17:24:08

标签: java scala apache-spark classloader

我在本地模式下在Apache Spark中运行一个作业,将其结果保存到s3a文件系统。由于Hadoop 2.6没有s3a://实现(或s3://,s3n://)。我打包了一个包含hadoop-aws 2.6.0的所有传递依赖的超级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和&amp; AWSCredentialsProviderChain在我提到的超级罐子里。我还检查了其他罐子,包括工人的火花库和我主要工作的jar(已经部署到spark / worker目录),并且可以确认他们都没有具有相同名称的类。所以它不能成为jar地狱问题(此外,在这种情况下抛出的错误应该是一个Property / MethodNotFoundError)。您是否知道可能发生的事情以及如何解决?

1 个答案:

答案 0 :(得分:1)

之前我遇到过类似的问题,我的解决方案是在运行spark-submit时将超级jar本身添加到--driver-class-path。你的uber-jar不是由JVM直接执行的。相反,它由Spark的某种驱动程序包装程序运行。将uber jar添加到驱动程序的类路径似乎是不必要的,但有时可以解决一些奇怪的NoClassDefFoundError。我不确定它是否可以解决您的问题,但值得一试。