Правда ... это обсуждалось довольно много.
Однако есть много двусмысленности и некоторые ответы предоставлены ... включая дублирование ссылок на jar в конфигурации или опциях jars / executor / driver.
Двусмысленные и / или опущенные детали
Следуя двусмысленности, неясные и / или пропущенные детали должны быть разъяснены для каждого варианта:
- Как влияет ClassPath
- Водитель
- Исполнитель (для выполнения задач)
- Обе
- не за что
- Разделительный символ: запятая, двоеточие, точка с запятой
- Если предоставленные файлы автоматически распространяются
- для задач (каждому исполнителю)
- для удаленного драйвера (если работает в режиме кластера)
- Тип принятого URI: локальный файл, hdfs, http и т. д.
- Если это место скопировано в общую папку (hdfs, local?)
Варианты, на которые это влияет:
--jars
SparkContext.addJar(...)
методSparkContext.addFile(...)
метод--conf spark.driver.extraClassPath=...
или--driver-class-path ...
--conf spark.driver.extraLibraryPath=...
, или--driver-library-path ...
--conf spark.executor.extraClassPath=...
--conf spark.executor.extraLibraryPath=...
- не стоит забывать, что последний параметр spark-submit также является файлом .jar.
Я знаю, где можно найти основную документацию по искрам , в частности, о том, как отправить , доступные параметры , а также 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
Нашел симпатичную статью по ответу на другой пост . Однако ничего нового не узнал. Постер хорошо отмечает разницу между локальным драйвером (клиент-пряжа) и удаленным драйвером (кластер пряжи). Определенно важно иметь в виду.
источник
Ответы:
ClassPath:
ClassPath зависит от того, что вы предоставляете. Есть несколько способов установить что-то на пути к классам:
spark.driver.extraClassPath
или это псевдоним--driver-class-path
для установки дополнительных путей к классам на узле, на котором работает драйвер.spark.executor.extraClassPath
установить дополнительный путь к классу на узлах Worker.Если вы хотите, чтобы определенный JAR-файл был применен как к основному устройству, так и к рабочему, вы должны указать их отдельно в обоих флагах.
Разделительный характер:
Следуя тем же правилам, что и JVM :
:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
;
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
Распределение файлов:
Это зависит от режима, в котором вы выполняете свою работу:
Режим клиента - Spark запускает HTTP-сервер Netty, который при запуске распределяет файлы для каждого из рабочих узлов. Вы можете видеть, что когда вы начинаете свою работу в Spark:
Режим кластера - в режиме кластера искра выбрала рабочий узел-лидер для выполнения процесса драйвера. Это означает, что задание не запускается напрямую с главного узла. Здесь Spark не будет устанавливать HTTP-сервер. Вы должны вручную сделать JARS доступным для всех рабочих узлов через HDFS / S3 / Другие источники, доступные для всех узлов.
Принятые URI для файлов
В разделе «Отправка приложений» документация Spark хорошо объясняет принятые префиксы для файлов:
Как уже отмечалось, JAR-файлы копируются в рабочий каталог для каждого рабочего узла. Где именно это? Это , как правило , под
/var/run/spark/work
, вы их увидите , как это:И когда вы загляните внутрь, вы увидите все файлы JAR, на которых вы развернули:
Затронутые варианты:
Самая важная вещь для понимания - это приоритет . Если вы передадите какое-либо свойство через код, оно будет иметь приоритет над любым параметром, указанным вами через
spark-submit
. Это упоминается в документации Spark:Поэтому убедитесь, что вы установили эти значения в нужных местах, чтобы не удивляться, когда один из них имеет приоритет над другим.
Давайте проанализируем каждый рассматриваемый вариант:
--jars
vsSparkContext.addJar
: они идентичны, только один устанавливается с помощью spark submit и один через код. Выберите тот, который подходит вам лучше. Важно отметить, что использование любого из этих параметров не добавляет JAR в ваш путь к классу драйвера / исполнителя , вам нужно явно добавить их, используяextraClassPath
конфигурацию обоих.SparkContext.addJar
vsSparkContext.addFile
: используйте первый, когда у вас есть зависимость, которую необходимо использовать с вашим кодом. Используйте последнее, когда вы просто хотите передать произвольный файл своим рабочим узлам, что не является зависимостью времени выполнения в вашем коде.--conf spark.driver.extraClassPath=...
или--driver-class-path
: это псевдонимы, не важно, какой вы выберете--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
То же, что и выше, псевдонимы.--conf spark.executor.extraClassPath=...
Используйте это, если у вас есть зависимость, которую нельзя включить в UAR JAR (например, из-за конфликтов времени компиляции между версиями библиотеки) и которую необходимо загрузить во время выполнения.--conf spark.executor.extraLibraryPath=...
Это передается какjava.library.path
опция для JVM. Используйте это, когда вам нужен путь к библиотеке, видимый для JVM.Вы можете смело предполагать это только для режима клиента, а не режима кластера. Как я уже говорил. Кроме того, приведенный вами пример имеет несколько избыточных аргументов. Например, передача JAR-файлов
--driver-library-path
бесполезна, вам нужно передать их,extraClassPath
если вы хотите, чтобы они были на вашем пути к классам. В конечном счете, то, что вы хотите сделать при развертывании внешних JAR-файлов как на драйвере, так и на рабочем месте, это:источник
MANIFEST.MF
файле)?assemblyMergeStrategy
и выбираю классы, которые мне нужны, если возникают конфликты. Я бы вообще рекомендовал то же самое.--jars
флагу, так и пути к классу драйвера / исполнителя.zeppelin-env.sh
добавить переменные окружения в и добавить--jars
вSPARK_SUBMIT_OPTIONS
. Это сработало. URI использование формата I является--jars=local:///mnt/dir/file.jar
.Другой подход
spark 2.1.0
заключается в использовании--conf spark.driver.userClassPathFirst=true
во время spark-submit, который изменяет приоритет загрузки зависимостей и, следовательно, поведение spark-job, давая приоритет банкам, которые пользователь добавляет к пути к классам с помощью--jars
опции.источник
Другой вариант конфигурируемого Спарка , относящийся к баночкам и классам, в случае ,
yarn
как режим развертывания являетсяИз документации искровой
Пользователи могут настроить этот параметр, чтобы указать свои файлы jar, которые inturn включается в путь к классу драйвера Spark.
источник
При использовании spark-submit с --master yarn-cluster, jar приложения вместе с любыми jar-файлами, включенными в опцию --jars, будет автоматически перенесен в кластер. URL-адреса, указанные после --jars, должны быть разделены запятыми. Этот список включен в пути к классам драйвера и исполнителя
Пример :
spark-submit - мастер-кластер пряжи --jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar
https://spark.apache.org/docs/latest/submitting-applications.html
источник
Существует ограничение на использование
--jars
: если вы хотите указать каталог для расположенияjar/xml
файла, он не разрешает расширение каталога. Это означает, что если вам нужно указать абсолютный путь для каждой банки.Если вы укажете
--driver-class-path
и выполняете в режиме кластера пряжи, то класс драйвера не обновляется. Мы можем проверить, обновлен ли путь к классу или нет в интерфейсе spark UI или сервере истории обновлений в среде вкладок.Опция, которая работала для меня, чтобы передать jar, которые содержат расширения каталогов и которые работали в режиме кластера пряжи была
--conf
опцией. Лучше передавать пути классов драйвера и исполнителя as--conf
, что добавляет их к самому объекту сеанса Spark, и эти пути отражаются в конфигурации Spark. Но, пожалуйста, убедитесь, что файлы jar размещены в одном кластере.источник
В то время как мы отправляем задания spark с помощью утилиты spark-submit, есть опция
--jars
. Используя эту опцию, мы можем передать файл jar приложениям spark.источник
—jar
вариант, было упомянуто оригинальным постером, а также более детально обсуждено более одного ответа. Не похоже, что вы предлагаете что-то новое?