ClassPath:
ClassPath зависит от того, что вы предоставляете. Есть несколько способов установить что-то на пути к классам:
spark.driver.extraClassPath
или это псевдоним --driver-class-path
для установки дополнительных путей к классам на узле, на котором работает драйвер.
spark.executor.extraClassPath
установить дополнительный путь к классу на узлах Worker.
Если вы хотите, чтобы определенный 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"
Распределение файлов:
Это зависит от режима, в котором вы выполняете свою работу:
Режим клиента - Spark запускает HTTP-сервер Netty, который при запуске распределяет файлы для каждого из рабочих узлов. Вы можете видеть, что когда вы начинаете свою работу в Spark:
16/05/08 17:29:12 INFO HttpFileServer: HTTP File server directory is /tmp/spark-48911afa-db63-4ffc-a298-015e8b96bc55/httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b
16/05/08 17:29:12 INFO HttpServer: Starting HTTP Server
16/05/08 17:29:12 INFO Utils: Successfully started service 'HTTP file server' on port 58922.
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/foo.jar at http://***:58922/jars/com.mycode.jar with timestamp 1462728552732
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/aws-java-sdk-1.10.50.jar at http://***:58922/jars/aws-java-sdk-1.10.50.jar with timestamp 1462728552767
Режим кластера - в режиме кластера искра выбрала рабочий узел-лидер для выполнения процесса драйвера. Это означает, что задание не запускается напрямую с главного узла. Здесь Spark не будет устанавливать HTTP-сервер. Вы должны вручную сделать JARS доступным для всех рабочих узлов через HDFS / S3 / Другие источники, доступные для всех узлов.
Принятые URI для файлов
В разделе «Отправка приложений» документация Spark хорошо объясняет принятые префиксы для файлов:
При использовании spark-submit jar приложения вместе со всеми jar-файлами, включенными в опцию --jars, будет автоматически перенесен в кластер. Spark использует следующую схему URL, чтобы разрешить разные стратегии распространения jar-файлов:
- 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
: они идентичны, только один устанавливается с помощью spark submit и один через код. Выберите тот, который подходит вам лучше. Важно отметить, что использование любого из этих параметров не добавляет JAR в ваш путь к классу драйвера / исполнителя , вам нужно явно добавить их, используя extraClassPath
конфигурацию обоих.
SparkContext.addJar
vs SparkContext.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 приложения, используя 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