ClassPath:
ClassPath zależy od tego, co podasz. Istnieje kilka sposobów ustawienia czegoś w ścieżce klas:
spark.driver.extraClassPath
lub jest to alias --driver-class-path
do ustawiania dodatkowych ścieżek klas w węźle, na którym działa sterownik.
spark.executor.extraClassPath
aby ustawić dodatkową ścieżkę klas w węzłach Worker.
Jeśli chcesz, aby określony plik JAR był wykonywany zarówno na urządzeniu głównym, jak i na robaku, musisz określić je osobno w OBU flagach.
Znak separacji:
Zgodnie z tymi samymi zasadami, co JVM :
- Linux: dwukropek
:
- na przykład:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows: średnik
;
- na przykład:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
Dystrybucja plików:
Zależy to od trybu, w którym wykonujesz swoją pracę:
Tryb klienta - Spark uruchamia serwer HTTP Netty, który dystrybuuje pliki podczas uruchamiania dla każdego węzła roboczego. Możesz zobaczyć, że rozpoczynając pracę w 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
Tryb klastra - w trybie klastra Spark wybrał wiodący węzeł Worker, na którym ma wykonać proces sterownika. Oznacza to, że zadanie nie jest uruchamiane bezpośrednio z węzła głównego. Tutaj Spark nie ustawi serwera HTTP. Musisz ręcznie udostępnić pliki JARS dla wszystkich węzłów roboczych za pośrednictwem HDFS / S3 / innych źródeł, które są dostępne dla wszystkich węzłów.
Akceptowane identyfikatory URI dla plików
W sekcji „Przesyłanie wniosków” dokumentacja Spark dobrze radzi sobie z wyjaśnianiem akceptowanych prefiksów plików:
Podczas korzystania z funkcji wysyłania iskier plik jar aplikacji wraz ze wszystkimi plikami JAR uwzględnionymi w opcji --jars zostaną automatycznie przeniesione do klastra. Spark używa następującego schematu adresu URL, aby umożliwić różne strategie rozpowszechniania słoików:
- file: - Bezwzględne ścieżki i file: / URI są obsługiwane przez serwer plików HTTP sterownika, a każdy moduł wykonawczy pobiera plik z serwera HTTP sterownika.
- hdfs :, http :, https :, ftp: - te pliki rozwijane i JAR z URI zgodnie z oczekiwaniami
- local: - oczekuje się, że identyfikator URI zaczynający się od local: / będzie istniał jako plik lokalny w każdym węźle roboczym. Oznacza to, że żadne operacje we / wy sieci nie zostaną poniesione i działa dobrze w przypadku dużych plików / plików JAR, które są wysyłane do każdego pracownika lub udostępniane przez NFS, GlusterFS itp.
Należy pamiętać, że pliki JAR i pliki są kopiowane do katalogu roboczego dla każdego SparkContext w węzłach wykonawczych.
Jak zauważono, pliki JAR są kopiowane do katalogu roboczego dla każdego węzła roboczego . Gdzie to dokładnie jest? Jest to zwykle pod /var/run/spark/work
zobaczysz je tak:
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
A kiedy zajrzysz do środka, zobaczysz wszystkie wdrożone pliki 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
Dotyczy opcji:
Najważniejszą rzeczą do zrozumienia jest priorytet . Jeśli przekażesz jakąkolwiek właściwość za pomocą kodu, będzie ona miała pierwszeństwo przed dowolną opcją określoną za pomocą spark-submit
. Jest to wspomniane w dokumentacji Spark:
Wszelkie wartości określone jako flagi lub w pliku właściwości zostaną przekazane do aplikacji i scalone z wartościami określonymi za pośrednictwem SparkConf. Właściwości ustawione bezpośrednio w SparkConf mają najwyższy priorytet , następnie flagi przekazane do funkcji Spark-submit lub Spark-Shell, a następnie opcje w pliku spark-defaults.conf
Dlatego upewnij się, że ustawiłeś te wartości we właściwych miejscach, aby nie zdziwić się, gdy jedna ma pierwszeństwo przed drugą.
Przeanalizujmy każdą opcję, o której mowa:
--jars
vs SparkContext.addJar
: Są identyczne, tylko jeden jest ustawiany przez przesyłanie iskry, a drugi przez kod. Wybierz ten, który bardziej Ci odpowiada. Jedną ważną rzeczą do zapamiętania jest to, że użycie którejkolwiek z tych opcji nie dodaje pliku JAR do ścieżki klas sterownika / modułu wykonawczego , musisz jawnie dodać je za pomocą extraClassPath
konfiguracji obu.
SparkContext.addJar
vs SparkContext.addFile
: Użyj tego pierwszego, gdy masz zależność, która musi być używana z twoim kodem. Użyj tego ostatniego, gdy chcesz po prostu przekazać dowolny plik do węzłów roboczych, co nie jest zależnością czasu wykonywania w kodzie.
--conf spark.driver.extraClassPath=...
lub --driver-class-path
: To są aliasy, nie ma znaczenia, który wybierzesz
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
Jak wyżej, aliasy.
--conf spark.executor.extraClassPath=...
: Użyj tego, gdy masz zależność, której nie można dołączyć do pliku JAR typu uber (na przykład z powodu konfliktów czasu kompilacji między wersjami biblioteki) i którą musisz załadować w czasie wykonywania.
--conf spark.executor.extraLibraryPath=...
Jest to java.library.path
opcja dla maszyny JVM. Użyj tego, gdy potrzebujesz ścieżki biblioteki widocznej dla maszyny JVM.
Czy byłoby bezpiecznie założyć, że dla uproszczenia mogę dodać dodatkowe pliki jar aplikacji, korzystając z 3 głównych opcji w tym samym czasie:
Możesz bezpiecznie założyć to tylko w trybie klienta, a nie w trybie klastrowym. Jak powiedziałem wcześniej. Ponadto podany przykład ma kilka zbędnych argumentów. Na przykład przekazywanie plików JAR do --driver-library-path
jest bezużyteczne, musisz je przekazać, extraClassPath
jeśli chcesz, aby znalazły się na Twojej ścieżce klas. Ostatecznie to, co chcesz zrobić, gdy wdrażasz zewnętrzne pliki JAR zarówno na sterowniku, jak i na pracowniku, to:
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