Подтвердить что ты не робот

Spark выдает ClassNotFoundException при использовании опции -jars

Я пытался следовать примеру автономного приложения Spark, описанному здесь https://spark.apache.org/docs/latest/quick-start.html#standalone-applications

Пример прошел нормально со следующим вызовом:

spark-submit  --class "SimpleApp" --master local[4] target/scala-2.10/simple-project_2.10-1.0.jar

Однако, когда я попытался ввести некоторые сторонние библиотеки через --jars, он выдает ClassNotFoundException.

$ spark-submit --jars /home/linpengt/workspace/scala-learn/spark-analysis/target/pack/lib/* \
  --class "SimpleApp" --master local[4] target/scala-2.10/simple-project_2.10-1.0.jar

Spark assembly has been built with Hive, including Datanucleus jars on classpath
Exception in thread "main" java.lang.ClassNotFoundException: SimpleApp
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:300)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

Удаление опции --jars, и программа снова запускается (я еще не начал использовать эти библиотеки). В чем проблема? Как добавить внешние банки?

4b9b3361

Ответ 1

В соответствии с spark-submit --help параметр --jars ожидает, что список локальных баннеров, разделенных запятыми, будет включен в пути к классам драйверов и исполнителей.

Я думаю, что здесь происходит то, что /home/linpengt/workspace/scala-learn/spark-analysis/target/pack/lib/* расширяется в список блоков, разделенных пробелами, а второй JAR в списке обрабатывается как банка приложения.

Одним из решений является использование вашей оболочки для создания списка банок, разделенных запятыми; здесь быстрый способ сделать это в bash на основе fooobar.com/questions/100349/... (см. ответ для более сложных подходов, которые обрабатывают имена файлов, которые содержат пробелы):

spark-submit --jars $(echo /dir/of/jars/*.jar | tr ' ' ',') \
    --class "SimpleApp" --master local[4] path/to/myApp.jar

Ответ 2

Является ли ваш класс SimpleApp в любом конкретном пакете? Кажется, что вам нужно включить полное имя пакета в командной строке. Итак, если класс SimpleApp находится в com.yourcompany.yourpackage, вам придется отправить работу Spark с помощью класса -class "com.yourcompany.yourpackage.SimpleApp" вместо "classApp" класса. У меня была та же проблема, и я заменил имя на полный пакет и имя класса. Надеюсь, что это поможет!