Benar ... sudah banyak dibahas.
Namun ada banyak ambiguitas dan beberapa jawaban yang diberikan ... termasuk duplikat referensi jar di guci / pelaksana / konfigurasi driver atau opsi.
Detail yang ambigu dan / atau dihilangkan
Rincian ambiguitas, tidak jelas, dan / atau dihilangkan berikut ini harus diklarifikasi untuk setiap opsi:
- Bagaimana ClassPath terpengaruh
- Sopir
- Pelaksana (untuk tugas yang sedang berjalan)
- Kedua
- tidak semuanya
- Karakter pemisahan: koma, titik dua, titik koma
- Jika file yang disediakan didistribusikan secara otomatis
- untuk tugas-tugas (untuk setiap pelaksana)
- untuk Driver jarak jauh (jika dijalankan dalam mode cluster)
- jenis URI yang diterima: file lokal, hdfs, http, dll
- Jika disalin ke lokasi umum, di mana lokasi itu (hdfs, lokal?)
Opsi yang mempengaruhi:
--jars
SparkContext.addJar(...)
metodeSparkContext.addFile(...)
metode--conf spark.driver.extraClassPath=...
atau--driver-class-path ...
--conf spark.driver.extraLibraryPath=...
, atau--driver-library-path ...
--conf spark.executor.extraClassPath=...
--conf spark.executor.extraLibraryPath=...
- jangan lupa, parameter terakhir dari spark-submit juga file .jar.
Saya tahu di mana saya dapat menemukan dokumentasi percikan utama , dan secara khusus tentang cara mengirim , opsi yang tersedia, dan juga JavaDoc . Namun yang tersisa untuk saya masih beberapa lubang, meskipun itu menjawab sebagian juga.
Saya harap ini tidak terlalu rumit, dan seseorang dapat memberi saya jawaban yang jelas dan ringkas.
Jika saya harus menebak dari dokumentasi, tampaknya --jars
, dan SparkContext
addJar
dan addFile
metode adalah orang-orang yang secara otomatis akan mendistribusikan file, sementara pilihan lain hanya memodifikasi ClassPath tersebut.
Apakah aman untuk berasumsi bahwa untuk kesederhanaan, saya dapat menambahkan file jar aplikasi tambahan menggunakan 3 opsi utama secara bersamaan:
spark-submit --jar additional1.jar,additional2.jar \
--driver-library-path additional1.jar:additional2.jar \
--conf spark.executor.extraLibraryPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar
Menemukan artikel yang bagus tentang jawaban untuk posting lain . Namun tidak ada yang baru dipelajari. Poster memang membuat pernyataan yang baik tentang perbedaan antara driver lokal (klien benang) dan Remote Driver (kluster benang). Jelas penting untuk diingat.
Jawaban:
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 :
:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
;
--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:
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:
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:Dan ketika Anda melihat ke dalam, Anda akan melihat semua JAR yang Anda gunakan:
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: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
vsSparkContext.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 menggunakanextraClassPath
konfigurasi pada keduanya.SparkContext.addJar
vsSparkContext.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 sebagaijava.library.path
opsi untuk JVM. Gunakan ini ketika Anda membutuhkan jalur pustaka yang terlihat oleh JVM.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 meneruskannyaextraClassPath
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:sumber
MANIFEST.MF
file)?assemblyMergeStrategy
dan memilih kelas yang saya butuhkan jika ada konflik. Saya biasanya akan merekomendasikan hal yang sama.--jars
flag dan jalur kelas driver / executor.zeppelin-env.sh
dan ditambahkan--jars
keSPARK_SUBMIT_OPTIONS
. Itu berhasil. Format URI yang saya gunakan adalah--jars=local:///mnt/dir/file.jar
.Pendekatan lain
spark 2.1.0
adalah dengan menggunakan--conf spark.driver.userClassPathFirst=true
selama spark-submit yang mengubah prioritas beban dependensi, dan dengan demikian perilaku pekerjaan percikan, dengan memberikan prioritas kepada guci yang ditambahkan pengguna ke jalur kelas dengan--jars
opsi.sumber
Opsi Spark yang dapat dikonfigurasi lainnya yang berkaitan dengan guci dan classpath, dalam hal
yarn
mode penyebaran adalah sebagai berikutDari dokumentasi percikan,
Pengguna dapat mengkonfigurasi parameter ini untuk menentukan guci mereka, yang inturn akan dimasukkan dalam classpath driver Spark.
sumber
Saat menggunakan percikan-kirim dengan -master thread-cluster, stoples aplikasi beserta semua toples yang disertakan dengan opsi - toples akan secara otomatis ditransfer ke cluster. URL yang diberikan setelah - jar harus dipisahkan dengan koma. Daftar itu termasuk dalam classpath driver dan executor
Contoh:
percikan-kirim - master thread-cluster --jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar
https://spark.apache.org/docs/latest/submitting-applications.html
sumber
Ada batasan dalam menggunakan
--jars
: jika Anda ingin menentukan direktori untuk lokasijar/xml
file, itu tidak memungkinkan ekspansi direktori. Ini berarti jika Anda perlu menentukan jalur absolut untuk setiap toples.Jika Anda menentukan
--driver-class-path
dan Anda mengeksekusi dalam mode cluster yarn, maka kelas driver tidak diperbarui. Kami dapat memverifikasi apakah jalur kelas diperbarui atau tidak di bawah spark ui atau server riwayat percikan di bawah lingkungan tab.Opsi yang berhasil bagi saya untuk melewatkan stoples yang berisi ekspansi direktori dan yang bekerja dalam mode cluster benang adalah
--conf
opsi. Lebih baik untuk melewati jalur kelas driver dan executor sebagai--conf
, yang menambahkan mereka untuk memicu objek sesi itu sendiri dan jalur tersebut tercermin pada Konfigurasi Spark. Tapi Tolong pastikan untuk menempatkan stoples di jalur yang sama melintasi cluster.sumber
Sementara kami mengirimkan pekerjaan percikan menggunakan utilitas percikan-percikan, ada opsi
--jars
. Dengan menggunakan opsi ini, kita dapat mengirimkan file jar untuk memicu aplikasi.sumber
—jar
opsi ini disebutkan oleh poster asli, ditambah dibahas lebih detail dengan lebih dari satu jawaban. Tampaknya Anda tidak menyediakan sesuatu yang baru?