java.lang.NoSuchMethodError при развертывании моей программы с использованием spark-submit - PullRequest
0 голосов
/ 19 апреля 2019

Я пишу программу для загрузки данных по какой-либо ссылке s3a: //. Программа компилируется через mvn install. Локальный запуск программы (как при использовании java -jar jarfile.jar) не дал ошибки. Однако, когда я использую spark-submit (как при использовании spark-submit jarfile.jar), он возвращает такую ​​ошибку:

Исключение в потоке "main" java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations () V, в org.apache.hadoop.fs.s3a.S3AFileSystem.addDeprecatedKeys (S3AFileSystem.java:181) в org.apache.hadoop.fs.s3a.S3AFileSystem. (S3AFileSystem.java:185) в java.lang.Class.forName0 (собственный метод) в java.lang.Class.forName (Class.java:348) ...

Журнал ошибок прослеживается до этой части моего исходного кода:

sparkDataset
        .write()
        .format("parquet")
        .mode(SaveMode.Overwrite)
        .save("some s3a:// link");

, где sparkDataset - это экземпляр org.apache.spark.sql.Dataset.

Попытка Как получить доступ к файлам s3a: // из Apache Spark? не удалась и вернула другую ошибку как таковую:

Исключение в потоке "main" java.lang.NoClassDefFoundError: орг / Apache / Hadoop / фс / GlobalStorageStatistics $ StorageStatisticsProvider

Проблема из java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations () V также маловероятно, потому что я могу работать локально, в котором совместимость не является проблемой.

Кроме того, я использовал версию связанных библиотек:

  • AWS-ява-СДК-пакет: 1.11.199
  • Hadoop-AWS: 3.0.0

Я ожидаю файлы, написанные по ссылкам s3a: //. Я думаю, что зависимость не проблема, потому что я могу работать локально. Я сталкиваюсь с этой проблемой только при использовании spark-submit для запуска этой программы. У кого-нибудь есть идеи, как решить эту проблему?

Редактировать: Кроме того, я проверил, что версия spark, отправленная в spark, называется созданной для hadoop 2.7 и выше. Я строго использую hadoop 3.0.0. Может ли это быть подсказкой, почему такая ошибка произошла в моей программе?

1 Ответ

0 голосов
/ 20 апреля 2019

Ответ от Запустите spark-submit с моей собственной сборкой hadoop , похоже, помог мне найти собственное решение.

Исходя из моего понимания, по неизвестной причине *, spark-submit, предоставляемый дистрибутивом 'spark-2.4.0-bin-hadoop2.7.tgz', исключит любые пакеты hadoop, скомпилированные вместе в вашем приложении. .

Причина возникновения ошибки NoSuchMethodError заключается в том, что метод reloadExistingConfiguration не существует до версии 2.8.x Hadoop. Казалось, что написание паркета каким-то образом вызовет этот конкретный метод.

Мое решение состоит в том, чтобы использовать отдельный дистрибутив «spark-2.4.0-without-hadoop.tgz» при подключении его к hadoop 3.0.0, чтобы он использовал правильную версию hadoop, даже если spark-submit исключил пакеты в вашем приложении во время исполнения.

Кроме того, поскольку в любом случае пакет spark-submit будет исключать пакеты, я не буду создавать толстую банку во время компиляции через Maven. Вместо этого я бы использовал флаг --packages во время выполнения, чтобы указать зависимости, необходимые для запуска моего приложения.

...