ClassPath:
ClassPath впливає залежно від того, що ви надаєте. Є кілька способів встановити щось на класі:
spark.driver.extraClassPath
або це псевдонім, --driver-class-path
щоб встановити додаткові класові шляхи на вузлі, на якому працює драйвер.
spark.executor.extraClassPath
встановити додатковий шлях до класів на вузлах Worker.
Якщо ви хочете, щоб певний JAR був здійснений як для Майстра, так і для робітника, вам потрібно вказати їх окремо у прапорах BOTH.
Характер розділення:
Дотримуючись тих же правил, що і 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
Режим кластера - у режимі кластера вибирається іскра «Leader Worker» для запуску процесу драйвера. Це означає, що завдання не виконується безпосередньо з вузла Master. Тут Spark не встановлюватиме HTTP-сервер. Вам потрібно вручну зробити доступними JARS для всіх робочих вузлів через HDFS / S3 / Інші джерела, доступні для всіх вузлів.
Прийнято URI для файлів
У розділі "Надсилання програм" документація Spark добре роз'яснює прийняті префікси для файлів:
При використанні іскрової подачі, jar програми разом з будь-якими банками, що входять до опції --jars, буде автоматично перенесено в кластер. Spark використовує таку схему URL, щоб дозволити різні стратегії розповсюдження банок:
- Файл: - Абсолютні шляхи та файл: / URI подаються на HTTP-файловий сервер драйвера, і кожен виконавець витягує файл з HTTP-сервера драйвера.
- hdfs:, http:, https :, ftp: - ці витягаючі файли та JAR з URI, як очікувалося
- local: - URI, що починається з local: /, як очікується, буде існувати як локальний файл на кожному робочому вузлі. Це означає, що жодного мережевого вводу-виводу не буде здійснено і працює добре для великих файлів / JAR-файлів, які передаються кожному працівнику або передаються через NFS, GlusterFS тощо.
Зауважте, що JAR-файли та файли копіюються у робочий каталог для кожного SparkContext на вузлах виконавця.
Як зазначалося, JAR копіюються в робочий каталог для кожного вузла Worker. Де саме це? Це , як правило , під /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 -defaults.conf
Тому переконайтеся, що ви встановили ці значення у відповідних місцях, так що ви не здивуєтесь, коли один має пріоритет над іншим.
Давайте проаналізуємо кожен із питань, про які йдеться:
--jars
vs SparkContext.addJar
: Вони ідентичні, лише один встановлюється за допомогою іскрової подачі та один за допомогою коду. Виберіть той, який вам найбільше підходить. Важливо відзначити, що використання будь-якого з цих параметрів не додає JAR до вашого драйвера / виконавця classpath , вам потрібно буде чітко додати їх за допомогою 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=...
: Використовуйте це, коли у вас є залежність, яка не може бути включена до JAR uber (наприклад, тому, що між версіями бібліотеки існують конфлікти часу компіляції) і яку вам потрібно завантажити під час виконання.
--conf spark.executor.extraLibraryPath=...
Це передається як java.library.path
опція для СВМ. Використовуйте це, коли вам потрібен шлях до бібліотеки, видимий JVM.
Чи можна було б припустити, що для простоти я можу додати додаткові файли jar програми, використовуючи одночасно 3 основні параметри:
Ви можете сміливо вважати це лише для режиму клієнта, а не для кластерного режиму. Як я вже говорив раніше. Також приклад, який ви навели, має кілька зайвих аргументів. Наприклад, передавати JARs --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