Я застрял при попытке запустить приложение Spark, написанное в Scala, на кластере искр с помощью команды spark-submit
. Кластер находится на EMR. Это больше о том, как spark отправляет файлы jar драйверу / исполнителям и как он изменяет путь к классам.
Мое приложение не является полноценным Uber JAR, вместо этого у меня есть все банки в папке, и я отправляю их через кластер при запуске с использованием опции --jars
.
Версия Spark - 2.4.4
. Вот как я запускаю свое приложение:
JARS=$(ls -m target/pack/lib/* | tr -d ' ' | tr -d '\n')
# Note : I tried with/without including $HADOOP_JARS
HADOOP_JARS=$(ls -md /usr/lib/hadoop/lib/*.jar | tr -d ' ' | tr -d '\n')
spark-submit --master yarn \
--class my.main.class \
--driver-memory 2G\
--executor-memory 3G\
--executor-cores 2\
--num-executors 2 \
--conf "spark.executor.extraJavaOptions=-Dorg.bytedeco.javacpp.maxbytes=4G"\
--conf "spark.driver.extraJavaOptions=-Dorg.bytedeco.javacpp.maxbytes=3G"\
--conf spark.executor.memoryOverhead=4G\
--conf spark.driver.memoryOverhead=2048\
--jars $JARS,$HADOOP_JARS \
target/scala-2.11/tep_dl4j_2.11-1.0.jar arg1 arg2
Затем я пытаюсь создать DataFrame, читая CSV из S3. Здесь начинаются проблемы:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jets3t/service/ServiceException
at org.apache.hadoop.fs.s3native.NativeS3FileSystem.createDefaultStore(NativeS3FileSystem.java:343)
at org.apache.hadoop.fs.s3native.NativeS3FileSystem.initialize(NativeS3FileSystem.java:333)
(я пропускаю все трассировки стека)
Caused by: java.lang.ClassNotFoundException: org.jets3t.service.ServiceException
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
... 28 more
Этот класс (org.jets3t.service.ServiceException) происходит из файла jets3t-0.9.0.jar
который отправляется при запуске кластера, в соответствии с этой строкой:
INFO Client: Uploading resource file:/usr/lib/hadoop/lib/jets3t-0.9.0.jar -> hdfs://ip-172-31-10-119.ec2.internal:8020/user/hadoop/.sparkStaging/application_1582370799483_0001/jets3t-0.9.0.jar
Даже когда я go в пользовательском интерфейсе Spark, я вижу банку в записях пути к классам с надписью «Добавлено пользователем». Но все же это исключение.
Я посмотрел вокруг в SO и закончил на этом ответе . Единственный способ решить эту проблему - использовать параметр --driver-class-path. Более того, он говорит, что опция --jars
«не добавляет JAR в ваш путь к классу драйвера / исполнителя». Он, очевидно, прав, но это не то, что говорится в документации. Действительно, согласно документам:
При использовании spark-submit, jar приложения вместе со всеми jar-файлами, включенными в опцию --jars, будет автоматически перенесен в кластер. URL, указанные после --jars, должны быть разделены запятыми. Этот список включен в пути к классам драйвера и исполнителя. Расширение каталогов не работает с --jars.
Я что-то здесь упускаю? Какова цель отправки файлов через HDFS, но не включать их в путь к классам?
Спасибо за ваши ответы