ClassPath:
ClassPath dipengaruhi tergantung pada apa yang Anda berikan. Ada beberapa cara untuk mengatur sesuatu di classpath:
spark.driver.extraClassPath
atau alias --driver-class-path
untuk mengatur classpath tambahan pada node yang menjalankan driver.
spark.executor.extraClassPath
untuk mengatur jalur kelas tambahan pada node Pekerja.
Jika Anda ingin JAR tertentu dilakukan pada Master dan Pekerja, Anda harus menentukan ini secara terpisah di KEDUA bendera.
Karakter pemisahan:
Mengikuti aturan yang sama dengan JVM :
- Linux: Titik dua
:
- misalnya:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows: Tanda titik koma
;
- misalnya:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
Distribusi file:
Ini tergantung pada mode di mana Anda menjalankan pekerjaan Anda:
Mode klien - Spark meluncurkan server Netty HTTP yang mendistribusikan file saat start up untuk masing-masing node pekerja. Anda dapat melihatnya saat memulai pekerjaan Spark Anda:
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
Mode Cluster - Dalam mode cluster percikan memilih simpul Worker pemimpin untuk menjalankan proses Driver aktif. Ini berarti pekerjaan tidak berjalan langsung dari node Master. Di sini, Spark tidak akan menetapkan server HTTP. Anda harus secara manual membuat JARS Anda tersedia untuk semua node pekerja melalui HDFS / S3 / Sumber lain yang tersedia untuk semua node.
URI yang diterima untuk file
Dalam "Mengirimkan Aplikasi" , dokumentasi Spark melakukan pekerjaan yang baik untuk menjelaskan awalan yang diterima untuk file:
Saat menggunakan percikan-kirim, tabung aplikasi beserta semua toples yang disertakan dengan opsi - toples akan ditransfer secara otomatis ke cluster. Spark menggunakan skema URL berikut untuk memungkinkan berbagai strategi untuk menyebar guci:
- file: - Path absolut dan file: / URI dilayani oleh server file HTTP driver, dan setiap pelaksana menarik file dari server HTTP driver.
- hdfs :, http :, https :, ftp: - ini merobohkan file dan JAR dari URI seperti yang diharapkan
- local: - URI dimulai dengan local: / diharapkan ada sebagai file lokal pada setiap node pekerja. Ini berarti bahwa tidak ada IO jaringan yang akan terjadi, dan berfungsi dengan baik untuk file besar / JAR yang didorong ke setiap pekerja, atau dibagikan melalui NFS, GlusterFS, dll.
Perhatikan bahwa JAR dan file disalin ke direktori yang berfungsi untuk setiap SparkContext pada node pelaksana.
Seperti dicatat, JAR disalin ke direktori kerja untuk setiap simpul Pekerja. Di mana tepatnya itu? Hal ini biasanya di bawah /var/run/spark/work
, Anda akan melihat mereka seperti ini:
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
Dan ketika Anda melihat ke dalam, Anda akan melihat semua JAR yang Anda gunakan:
[*@*]$ 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
Opsi yang terpengaruh:
Hal yang paling penting untuk dipahami adalah prioritas . Jika Anda melewatkan properti apa pun melalui kode, itu akan lebih diutamakan daripada opsi yang Anda tentukan melalui spark-submit
. Ini disebutkan dalam dokumentasi Spark:
Nilai apa pun yang ditentukan sebagai flag atau dalam file properti akan diteruskan ke aplikasi dan digabungkan dengan yang ditentukan melalui SparkConf. Properti yang disetel langsung pada SparkConf diutamakan , kemudian flag yang dikirimkan ke spark-submit atau spark-shell, lalu opsi di file spark-defaults.conf
Jadi pastikan Anda menetapkan nilai-nilai itu di tempat yang tepat, sehingga Anda tidak akan terkejut ketika salah satu mengambil prioritas di atas yang lain.
Mari kita menganalisis setiap opsi yang dipertanyakan:
--jars
vs SparkContext.addJar
: Ini identik, hanya satu yang ditetapkan melalui kiriman kirim dan satu melalui kode. Pilih yang cocok dengan Anda. Satu hal penting yang perlu diperhatikan adalah bahwa menggunakan salah satu dari opsi ini tidak menambahkan JAR ke driver / executor classpath Anda, Anda harus menambahkannya secara eksplisit menggunakan extraClassPath
konfigurasi pada keduanya.
SparkContext.addJar
vs SparkContext.addFile
: Gunakan yang pertama ketika Anda memiliki ketergantungan yang perlu digunakan dengan kode Anda. Gunakan yang terakhir ketika Anda hanya ingin meneruskan file sewenang-wenang ke node pekerja Anda, yang bukan ketergantungan run-time dalam kode Anda.
--conf spark.driver.extraClassPath=...
atau --driver-class-path
: Ini alias, tidak masalah yang mana yang Anda pilih
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
Sama seperti di atas, alias.
--conf spark.executor.extraClassPath=...
: Gunakan ini ketika Anda memiliki dependensi yang tidak dapat dimasukkan dalam JAR uber (misalnya, karena ada konflik waktu kompilasi antara versi pustaka) dan yang Anda perlu memuat saat runtime.
--conf spark.executor.extraLibraryPath=...
Ini dilewatkan sebagai java.library.path
opsi untuk JVM. Gunakan ini ketika Anda membutuhkan jalur pustaka yang terlihat oleh JVM.
Apakah aman untuk berasumsi bahwa untuk kesederhanaan, saya dapat menambahkan file jar aplikasi tambahan menggunakan 3 opsi utama secara bersamaan:
Anda dapat dengan aman menganggap ini hanya untuk mode Klien, bukan mode Cluster. Seperti yang saya katakan sebelumnya. Juga, contoh yang Anda berikan memiliki beberapa argumen yang berlebihan. Misalnya, meneruskan JAR --driver-library-path
tidak berguna, Anda perlu meneruskannya extraClassPath
jika Anda ingin mereka berada di jalur kelas Anda. Pada akhirnya, apa yang ingin Anda lakukan ketika Anda menggunakan JAR eksternal pada pengemudi dan pekerja adalah:
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