2017-02-21 4 views
1

Я хотел бы использовать свое приложение Spark jars. Больше в бетоне у меня есть одна банка mllib, которая еще не выпущена, которая содержит исправленную ошибку BisectingKMeans. Итак, моя идея - использовать его в моем искровом кластере (на местном уровне он отлично работает).Игнорировать Spark Cluster Собственные банки

Я пробовал много вещей: extraclasspath, userClassPathFirst, jars option ... много вариантов, которые не работают. Моя последняя идея - использовать правило Shade sbt для изменения всех пакетов org.apache.spark. * В shadespark. *, Но когда я его развертываю, он все еще использует кластерные искровые банки.

Любая идея?

ответ

0

Вы можете попытаться использовать плагин Maven shade, чтобы переместить конфликтующие пакеты. Это создает отдельное пространство имен для более новой версии mllib jar. Таким образом, как старая, так и новая версия будут находиться в пути к классам, но поскольку новая версия имеет альтернативное имя , вы можете явно ссылаться на новый пакет.

Посмотри https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html:

Если убер JAR повторно используются в качестве зависимости какого-либо другого проекта, непосредственно включая классы от зависимостей артефакта в убер JAR может вызвать конфликты класса загрузки из-за дублирование классов на пути к классу. Для решения этой проблемы, можно переместить классы, которые получают включенные в затененном артефакте для того, чтобы создать собственную копию их байткод:

Я получил эту идею из видео «Top 5 ошибок при написании Spark, приложений» : https://youtu.be/WyfHUNnMutg?t=23m1s

+0

Какая часть этого видео Гровер или Маласка говорит о плагине затенения? – eliasah

+0

@eliasah В 23 мин. Я отредактировал ссылку выше. – rdeboo

+0

Я пробовал это решение и, кажется, работал, каждый пакет был переименован, но все еще принимал искровые баночки. Временным решением было заменить mllib jar Spark (в папке с баночками) и использовать более новую, и это сработало. - – Gorka