Заставить java jar не использовать пакеты classpath в EMR

Я пытаюсь запустить толстую банку через spark-submit на ЭМИ. Я столкнулся с проблемой, связанной с зависимостями пакетов. Этот проект зависит от библиотеки google adwords, которую я включил в build.sbt. Проблема в том, что библиотека google adwords внутренне зависит от пакета с именем commons-configuration версии 1.10, но когда я запускаю этот jar-файл в EMR через spark-submit, который работает через yarn scheduler, версия 1.6 этого пакета (commons-configuration) используется, поскольку она является частью CLASSPATH в EMR. кластер. Я получаю следующую ошибку

java.lang.NoSuchMethodError: org.apache.commons.configuration.MapConfiguration

Я попытался явно передать банку зависимостей, используя опцию --jars из spark-submit

spark-submit --name my-awesome-spark-job --deploy-mode cluster --class package.path.to.my.Main --jars s3://jar-bucket/jars/commons-configuration-1.10.jar s3://code-bucket/jars/spark-code.jar

Выполнение этого по-прежнему дает мне ту же ошибку, что и пакет более старой версии из CLASSPATH, несмотря ни на что. Я хотел бы заставить свою банку включать зависимость внутри толстой банки и явно использовать их для определенных библиотек, например, библиотека google adwords здесь. Спасибо.

Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
0
712
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попытаться затенить зависимости, которые вы используете и у которых есть более старая версия, доступная в кластере.

Что вы используете для сборки кувшина? Я использовал эту стратегию с sbt https://github.com/sbt/sbt-assembly#затенение

Но есть и шейдерный плагин для maven: https://maven.apache.org/plugins/maven-shade-plugin/

Я использую sbt-assembly для создания банки. Я попытался затенить библиотеку Google с помощью ShadeRule.rename("com.google.**" -> "shade.com.google.@1").inAll, но дело в том, что эта библиотека внутренне зависит от какой-то другой библиотеки, которая имеет более старую версию в кластере. Так что это мне не помогло.

Afaq 22.05.2019 17:27

Ваше решение сработало, я затенил commons-configuration библиотеку, и все работает как часы. Благодаря тонну! Я добавил следующую строку ShadeRule.rename("org.apache.commons.configuration.**" -> "shade.org.apache.commons.configuration.@1").inAll

Afaq 22.05.2019 22:33

Другие вопросы по теме