spark-submit classNotFoundException: невозможно прочитать из s3 в EMR - PullRequest
3 голосов
/ 22 февраля 2020

Я застрял при попытке запустить приложение 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, но не включать их в путь к классам?

Спасибо за ваши ответы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...