Я запускаю задание в Apache Spark в локальном режиме, которое сохранит его результат в файловой системе s3a. Поскольку Hadoop 2.6 не имеет реализации s3a: // (или s3: //, s3n: //). Я упаковываю uber jar, который включает в себя всю транзитивную зависимость от hadoop-aws 2.6.0 и отправляет ее в банку моей основной работы.Apache Spark: Classloader не может найти classDef в банке
Однако, когда я протестировать его со следующим минималистском кодом:
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 находятся в упомянутой мною uber jar. Я также проверил другие баночки, в том числе искровую библиотеку для рабочих и банку моей основной работы (уже развернутую в каталог spark/worker), и мог подтвердить, что ни один из них не имеет класс с одинаковым именем. Таким образом, это не может быть проблемой аддона (кроме того, в этом случае брошенная ошибка должна быть Property/MethodNotFoundError). У вас есть какая-то подсказка, что могло случиться и как это исправить?
Вы использовали анализатор банки для проверки депы? Можете ли вы разместить свой build.sbt –
Я открываю все банки вручную, чтобы убедиться, что они есть. Для файла сборки см. Https://github.com/tribbloid/spookystuff/blob/improved-lookup/lib/pom.xml – tribbloid
@tribbloid устранили эту проблему? Я боюсь Spark 1.5.0 w/Hadoop 2.6.0, пытающегося изменить classpath, shadowjars и т. Д., И это не поможет. –