2015-05-24 2 views
4

Я запускаю задание в 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). У вас есть какая-то подсказка, что могло случиться и как это исправить?

+0

Вы использовали анализатор банки для проверки депы? Можете ли вы разместить свой build.sbt –

+0

Я открываю все банки вручную, чтобы убедиться, что они есть. Для файла сборки см. Https://github.com/tribbloid/spookystuff/blob/improved-lookup/lib/pom.xml – tribbloid

+0

@tribbloid устранили эту проблему? Я боюсь Spark 1.5.0 w/Hadoop 2.6.0, пытающегося изменить classpath, shadowjars и т. Д., И это не поможет. –

ответ

1

Я встретил аналогичную проблему раньше, и мое решение заключалось в том, чтобы добавить сам uber jar в путь -driver-class, пока вы запускаете spark-submit. JVM не запускается непосредственно вашим uber-jar. Вместо этого он запускается какой-то оболочкой драйвера Spark. Добавить uber jar в путь класса драйвера кажется ненужным, но иногда может решить какой-то странный NoClassDefFoundError. Я не уверен, может ли он решить вашу проблему, но стоит попробовать.

+0

Спасибо большое! Я попробую это немедленно – tribbloid

+0

Нет, но это немного лучше: s3 и s3n работают для режима локального кластера (или режима моделирования), но он выдает одну и ту же ошибку ClassNotFound в режиме реального кластера. – tribbloid

+0

Попробуйте установить spark.executor.userClassPathFirst = true, когда вы отправляете приложение, указав «-conf spark.executor.userClassPathFirst = true» на команду spark-submit –