Верно ... Об этом много говорили.

Однако есть много двусмысленности, и некоторые из предоставленных ответов ... включая дублирование ссылок на jar в конфигурации или параметрах jar / Execитель / драйвера.

Неоднозначные и / или опущенные реквизиты

Следующие двусмысленные, нечеткие и / или пропущенные детали должны быть уточнены для каждого варианта:

  • Как это влияет на ClassPath
    • Драйвер
    • Executor (для запущенных задач)
    • Оба
    • совсем нет
  • Символ-разделитель: запятая, двоеточие, точка с запятой
  • Если предоставленные файлы распространяются автоматически
    • по задачам (каждому исполнителю)
    • для удаленного драйвера (при работе в кластерном режиме)
  • допустимый тип URI: локальный файл, hdfs, http и т. Д.
  • Если скопировано в обычное местоположение, где это местоположение (hdfs, local?)

Параметры, на которые это влияет:

  1. - банки
  2. SparkContext.addJar (...) метод
  3. SparkContext.addFile (...) метод
  4. - conf spark.driver.extraClassPath = ... или - путь-класс-драйвера ...
  5. - conf spark.driver.extraLibraryPath = ...или - путь-библиотеки-драйвера ...
  6. - conf spark.executor.extraClassPath = ...
  7. - conf spark.executor.extraLibraryPath = ...
  8. не забывайте, последний параметр искры-submit также является файлом .jar.

Я знаю, где я могу найти основную документацию Spark, и, в частности, , как отправить, доступные параметры ,, а также JavaDoc. Однако это оставило для меня еще немало дыр, хотя и частично помогло.

Надеюсь, что это не так уж и сложно, и что кто-нибудь может дать мне четкий и лаконичный ответ.

Если бы я мог предположить из документации, кажется, что - jars, а методы SparkContext addJar и addFile являются те, которые будут автоматически распространять файлы, в то время как другие параметры просто изменяют ClassPath.

Можно ли предположить, что для простоты я могу добавить дополнительные jar-файлы приложения, используя 3 основных параметра одновременно:

spark-submit --jar additional1.jar,additional2.jar \
  --driver-library-path additional1.jar:additional2.jar \
  --conf spark.executor.extraLibraryPath=additional1.jar:additional2.jar \
  --class MyClass main-application.jar

Нашел красивую статью на ответ на другой пост. Однако ничего нового не узнал. Плакат хорошо описывает разницу между локальным драйвером (пряжа-клиент) и удаленным драйвером (пряжа-кластер). Определенно важно иметь в виду.

Ответы (6)

Путь к классам:

ClassPath зависит от того, что вы предоставляете. Есть несколько способов установить что-нибудь в пути к классам:

  • spark.driver.extraClassPath или его псевдоним - driver-class-path для установки дополнительных путей к классам на узле, на котором запущен драйвер.
  • spark.executor.extraClassPath, чтобы установить дополнительный путь к классам на рабочих узлах.

Если вы хотите, чтобы определенный JAR выполнялся как на Мастере, так и на Рабочем, вы должны указать их отдельно в ОБЕИХ флагах.

Знак разделения:

По тем же правилам, что и JVM:

  • Linux: двоеточие :
    • например: - conf "spark.driver.extraClassPath = / opt / prog / hadoop-aws-2.7.1.jar: /opt/prog/aws-java-sdk-1.10.50.jar"
  • Windows: точка с запятой ;
    • например: - conf "spark.driver.extraClassPath = / opt / prog / hadoop-aws-2.7.1.jar; /opt/prog/aws-java-sdk-1.10.50.jar"

Распространение файлов:

Это зависит от режима, в котором вы выполняете свою работу:

  1. Клиентский режим - Spark запускает HTTP-сервер Netty, который распределяет файлы при запуске для каждого из рабочих узлов. Вы можете видеть это, когда начинаете свою работу Spark:

    16.05.08 17:29:12 INFO HttpFileServer: каталог файлового сервера HTTP / tmp / spark-48911afa-db63-4ffc-a298-015e8b96bc55 / httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b
    16/05/08 17:29:12 ИНФОРМАЦИЯ HttpServer: запуск HTTP-сервера
    16/05/08 17:29:12 INFO Utils: Служба «Файловый сервер HTTP» успешно запущена на порту 58922.
    16/05/08 17:29:12 INFO SparkContext: добавлен JAR /opt/foo.jar по адресу http: // ***: 58922 / jars / com.mycode.jar с отметкой времени 1462728552732
    16.05.08 17:29:12 ИНФОРМАЦИЯ SparkContext: добавлен JAR /opt/aws-java-sdk-1.10.50.jar по адресу http: // ***: 58922 / jars / aws-java-sdk-1.10. 50.jar с отметкой времени 1462728552767
    
  2. Режим кластера - в режиме кластера искра выбрала ведущий рабочий узел для выполнения процесса драйвера. Это означает, что задание не выполняется напрямую с главного узла. Здесь Spark не будет устанавливать HTTP-сервер. Вы должны вручную сделать свой JARS доступным для всех рабочих узлов через HDFS / S3 / другие источники, которые доступны для всех узлов.

Принимаемые URI для файлов

В «Отправка приложений»документация Spark хорошо объясняет принятые префиксы для файлов:

При использовании spark-submit jar приложения вместе с любыми jar-файлами включенный с параметром --jars будет автоматически перенесен в кластер. Spark использует следующую схему URL-адресов, чтобы разрешить разные стратегии распространения банок:

  • file: - Абсолютные пути и file: / URI обслуживаются драйвером HTTP файловый сервер, и каждый исполнитель извлекает файл из драйвера HTTP сервер.
  • hdfs :, http :, https :, ftp: - эти раскрывающиеся файлы и JAR из URI, как ожидалось
  • local: - URI, начинающийся с local: / ожидается, что он будет существовать в виде локального файла на каждом рабочем узле. Это означает, что никаких сетевых операций ввода-вывода не будет, и хорошо работает для больших файлов / JAR которые отправляются каждому рабочему или совместно используются через NFS, GlusterFS и т. д.

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

Как уже отмечалось, JAR копируются в рабочий каталог для каждого рабочего узла. Где именно это? Это обычно под / var / run / spark / work, вы увидите их так:

drwxr-xr-x    3 spark spark   4096 May 15 06:16 app-20160515061614-0027
drwxr-xr-x    3 spark spark   4096 May 15 07:04 app-20160515070442-0028
drwxr-xr-x    3 spark spark   4096 May 15 07:18 app-20160515071819-0029
drwxr-xr-x    3 spark spark   4096 May 15 07:38 app-20160515073852-0030
drwxr-xr-x    3 spark spark   4096 May 15 08:13 app-20160515081350-0031
drwxr-xr-x    3 spark spark   4096 May 18 17:20 app-20160518172020-0032
drwxr-xr-x    3 spark spark   4096 May 18 17:20 app-20160518172045-0033

И когда вы заглянете внутрь, вы увидите все JAR, которые вы развернули вместе:

[*@*]$ cd /var/run/spark/work/app-20160508173423-0014/1/
[*@*]$ ll
total 89988
-rwxr-xr-x 1 spark spark   801117 May  8 17:34 awscala_2.10-0.5.5.jar
-rwxr-xr-x 1 spark spark 29558264 May  8 17:34 aws-java-sdk-1.10.50.jar
-rwxr-xr-x 1 spark spark 59466931 May  8 17:34 com.mycode.code.jar
-rwxr-xr-x 1 spark spark  2308517 May  8 17:34 guava-19.0.jar
-rw-r--r-- 1 spark spark      457 May  8 17:34 stderr
-rw-r--r-- 1 spark spark        0 May  8 17:34 stdout

Затронутые варианты:

Самое важное, что нужно понимать - это приоритет. Если вы передадите какое-либо свойство через код, оно будет иметь приоритет над любой опцией, указанной вами через spark-submit. Это упоминается в документации Spark:

Любые значения, указанные как флаги или в файле свойств, будут переданы в приложение и объединены с указанными через SparkConf.Свойства, установленные непосредственно на SparkConf, получают наивысшее значение приоритет, затем флаги передаются в spark-submit или spark-shell, затем параметры в файле spark-defaults.conf

Поэтому убедитесь, что вы установили эти значения в правильных местах, чтобы вы не удивились, когда одно будет иметь приоритет над другим.

Давайте проанализируем каждый рассматриваемый вариант:

  • - jars vs SparkContext.addJar: они идентичны, только один устанавливается через отправку искры, а другой через код. Выберите тот, который вам больше подходит. Важно отметить, что использование любого из этих параметров не добавляет JAR к пути к классам вашего драйвера / исполнителя, вам необходимо явно добавить их, используя конфигурацию extraClassPath на обоих .
  • SparkContext.addJar vs SparkContext.addFile: используйте первое, если у вас есть зависимость, которая должна использоваться с вашим кодом. Используйте последнее, если вы просто хотите передать произвольный файл своим рабочим узлам, что не является зависимостью во время выполнения в вашем коде.
  • - conf spark.driver.extraClassPath = ... или - driver-class-path: это псевдонимы, неважно, какой из них вы выберете
  • - conf spark.driver.extraLibraryPath = ... или --driver-library-path ... То же, что и выше, псевдонимы.
  • - conf spark.executor.extraClassPath = ...: используйте это, если у вас есть зависимость, которую нельзя включить в uber JAR (например, из-за конфликтов времени компиляции между версии библиотеки), которые необходимо загрузить во время выполнения.
  • - conf spark.executor.extraLibraryPath = ... Это передается как параметр java.library.path для JVM. Используйте это, если вам нужен путь к библиотеке, видимый JVM.

Можно ли предположить, что для простоты я могу добавить дополнительные jar-файлы приложения, используя 3 основных параметра одновременно:

Можно смело предположить, что это только для режима клиента, но не для режима кластера. Как я уже сказал. Кроме того, в приведенном вами примере есть несколько избыточных аргументов. Например, передача JAR в - driver-library-path бесполезна, вам нужно передать их в extraClassPath, если вы хотите, чтобы они находились в вашем пути к классам. В конечном итоге, когда вы развертываете внешние JAR как для драйвера, так и для рабочего, вы хотите:

spark-submit --jars additional1.jar,additional2.jar \
  --driver-class-path additional1.jar:additional2.jar \
  --conf spark.executor.extraClassPath=additional1.jar:additional2.jar \
  --class MyClass main-application.jar

Другой подход в spark 2.1.0 - использовать - conf spark.driver.userClassPathFirst = true во время spark-submit, который изменяет приоритет нагрузки зависимостей, и, следовательно, поведение искрового задания, отдавая приоритет банкам, которые пользователь добавляет в путь к классам, с параметром - jars.

Пока мы отправляем искровые задания с помощью утилиты spark-submit, есть опция - jars. Используя эту опцию, мы можем передать файл jar для запуска приложений.

Другая настраиваемая опция Spark, относящаяся к jar-файлам и пути к классам, в случае yarn в качестве режима развертывания:
Из документации Spark,

spark.yarn.jars

Список библиотек, содержащих код Spark для распространения в контейнеры YARN. По умолчанию Spark on YARN будет использовать файлы Spark jar, установленные локально, но файлы Spark также могут быть в удобном для чтения месте на HDFS. Это позволяет YARN кэшировать его на узлах, чтобы он не должны распространяться каждый раз при запуске приложения. Чтобы указать, например, на jar-файлы в HDFS, установите для этой конфигурации значение hdfs: /// some / path. Разрешены глобусы.

spark.yarn.archive

Архив, содержащий необходимые jar-файлы Spark для распространения в кеш YARN. Если установлено, это конфигурация заменяет spark.yarn.jars, и архив используется во всех контейнеры приложения. Архив должен содержать файлы jar в корневом каталоге. Как и в предыдущем варианте, архив также можно разместить на HDFS для ускорения работы с файлами. раздача.

Пользователи могут настроить этот параметр, чтобы указать свои jar-файлы, которые, в свою очередь, будут включены в путь к классам драйвера Spark.

Существует ограничение на использование - jars: если вы хотите указать каталог для размещения файла jar / xml, расширение каталога не допускается. Это означает, что вам нужно указать абсолютный путь для каждой банки.

Если вы укажете - driver-class-path и выполняете в режиме кластера пряжи, тогда класс драйвера не будет обновлен. Мы можем проверить, обновлен ли путь к классу или нет в пользовательском интерфейсе искры или на сервере истории искры в среде вкладок.

Опция, которая сработала для меня, чтобы передать jar-файлы, содержащие расширения каталогов и работавшие в режиме кластера пряжи, была опцией - conf. Лучше передавать пути к классам драйвера и исполнителя как - conf, что добавляет их к самому объекту сеанса Spark, и эти пути отражаются в конфигурации Spark. Но убедитесь, что файлы jar-файлов размещены по одному и тому же пути в кластере.

spark-submit \
  --master yarn \
  --queue spark_queue \
  --deploy-mode cluster    \
  --num-executors 12 \
  --executor-memory 4g \
  --driver-memory 8g \
  --executor-cores 4 \
  --conf spark.ui.enabled=False \
  --conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapred.output.dir=/tmp \
  --conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp

При использовании spark-submit с --master yarn-cluster jar приложения вместе с любыми jar-файлами, включенными с параметром --jars, будет автоматически перенесен в кластер. URL-адреса, указанные после --jars, должны быть разделены запятыми. Этот список включен в пути к классам драйвера и исполнителя

Пример:

spark-submit --master yarn-cluster --jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar

https://spark.apache.org/docs/latest/submitting-applications.html

2022 WebDevInsider