Путь к классу драйвера без отправленных JAR-файлов — ClassNotFoundException

У меня есть автономный кластер с одним узлом, на котором работает DataStax Enterprise 4.8 со Spark 1.4.1, в который я отправляю свое приложение в режиме кластера следующим образом:

dse spark-submit \
  --class MyApp \
  --master spark://MY-IP:6066 \
  --deploy-mode cluster \
  --packages LIST-OF-MY-DEPENDECIES \
  MyApp.jar

Кажется, это работает так, как должно. Он загружает все JAR-файлы для всех транзитивных зависимостей в локальный Maven и запускает мое приложение, однако эти JAR-файлы не находятся в пути к классам.

object MyApp {
  def main(args: Array[String]): Unit = {
    // This fails with: ClassNotFoundException
    getClass.getClassLoader.loadClass("akka.cluster.Cluster$")
  }
}

Я обнаружил, что загрузчик классов (org.apache.spark.util.MutableURLClassLoader) и его родители содержат только стандартные статические JAR-файлы, предоставляемые DataStax, расположенные под /usr/share/dse, но ни одну из моих зависимостей.

Другой вывод заключался в том, что свойство конфигурации Spark (а также системное свойство) с именем spark.jars содержит список этих JAR-файлов. Как они должны попасть в путь к классам?


person Rado Buransky    schedule 13.02.2016    source источник


Ответы (1)


Самый простой способ предоставить всем драйверам и исполнителям доступ к вашим зависимостям — упаковать их все в один uber jar.

Это вариант для вас?

Есть несколько вариантов, доступных для этого. Если вы используете sbt, sbt-assembly, вероятно, наиболее известна.

Если вы хотите использовать отдельные маленькие банки, SparkContext.addjar(path: String) может быть тем, что вам нужно. Вам просто нужно убедиться, что ваш путь находится либо в общей файловой системе (например, HDFS), либо в локальном каталоге, который является общим/реплицированным для всех узлов в кластере.

person marios    schedule 13.02.2016
comment
Примечание. Я никогда не использовал второй подход, поэтому дайте мне знать, если с ним возникнут проблемы, я могу рассмотреть его поближе. - person marios; 13.02.2016
comment
Uber jar вызывает проблемы из-за конфликтующих файлов ресурсов — перезаписывает reference.conf, а также становится довольно большим (100+ МБ). SparkContext.addjar не решает мою проблему. Самая первая строка основного метода требует JAR в пути к классам. Но ваш совет - это всего лишь обходной путь. Я хотел бы знать, почему мой подход не работает. Спасибо - person Rado Buransky; 14.02.2016