ClassPath:
ClassPath zależy od tego, co podasz. Istnieje kilka sposobów ustawienia czegoś w ścieżce klas:
spark.driver.extraClassPathlub jest to alias --driver-class-pathdo 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/workzobaczysz 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:
--jarsvs 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ą extraClassPathkonfiguracji obu.
SparkContext.addJarvs 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.pathopcja 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-pathjest bezużyteczne, musisz je przekazać, extraClassPathjeś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