sınıf yolu:
ClassPath, sağladığınıza bağlı olarak etkilenir. Sınıf yolunda bir şey belirlemenin birkaç yolu vardır:
spark.driver.extraClassPath
ya da takma ad --driver-class-path
sürücüyü çalıştıran düğümde ek sınıfyolları ayarlamak addır.
spark.executor.extraClassPath
İşçi düğümlerinde ek sınıf yolu ayarlamak için.
Hem Master hem de İşçi üzerinde belirli bir JAR'ın etkilenmesini istiyorsanız, bunları HEM bayraklarında ayrı ayrı belirtmeniz gerekir.
Ayırma karakteri:
JVM ile aynı kurallara uyulması :
- Linux: İki nokta üst üste
:
- Örneğin:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows: Noktalı virgül
;
- Örneğin:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
Dosya dağıtımı:
Bu, işinizi altında yürüttüğünüz moda bağlıdır:
İstemci modu - Spark, her çalışan düğümü için başlangıçta dosyaları dağıtan bir Netty HTTP sunucusu başlatır. Spark işinize başladığınızda şunu görebilirsiniz:
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
Küme modu - Küme modunda kıvılcım, Sürücü işlemini gerçekleştirmek için bir lider Çalışan düğümü seçti. Bu, işin doğrudan Ana düğümden çalışmadığı anlamına gelir. Burada, Kıvılcım olmaz bir HTTP sunucusu ayarlayın. JARS'nızı, tüm düğümler tarafından kullanılabilen HDFS / S3 / Diğer kaynaklar aracılığıyla tüm çalışan düğüm için manuel olarak kullanılabilir hale getirmelisiniz.
Dosyalar için kabul edilen URI'ler
In "gönderme Uygulamalar" , Spark dokümantasyon dosyaları için kabul edilen önekleri açıklayan iyi bir iş yapar:
Kıvılcım gönderme kullanılırken, --jars seçeneğiyle birlikte gelen kavanozlarla birlikte uygulama kavanozu otomatik olarak kümeye aktarılır. Spark, kavanozları dağıtmak için farklı stratejilere izin vermek için aşağıdaki URL şemasını kullanır:
- file: - Mutlak yollar ve dosya: / URI'ler sürücünün HTTP dosya sunucusu tarafından sunulur ve her yürütücü dosyayı sürücü HTTP sunucusundan alır.
- hdfs :, http :, https :, ftp: - bunlar dosyaları ve JAR'ları beklendiği gibi URI'den alır
- local: - her çalışan düğümünde local: / ile başlayan bir URI'nin yerel dosya olarak bulunması bekleniyor. Bu, hiçbir ağ GÇ gerçekleşmeyeceği ve her bir çalışana aktarılan veya NFS, GlusterFS vb. Yoluyla paylaşılan büyük dosyalar / JAR'lar için iyi çalışacağı anlamına gelir.
JAR'ların ve dosyaların yürütücü düğümlerindeki her SparkContext için çalışma dizinine kopyalandığını unutmayın.
Belirtildiği gibi, JAR'lar her bir İşçi düğümü için çalışma dizinine kopyalanır . Tam olarak nerede? Öyle genellikle altında /var/run/spark/work
böyle görürsünüz:
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
İçine baktığınızda, dağıttığınız tüm JAR'ları göreceksiniz:
[*@*]$ 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
Etkilenen seçenekler:
Anlaşılması gereken en önemli şey önceliktir . Herhangi bir özelliği kodla iletirseniz, belirttiğiniz herhangi bir seçeneğe göre öncelikli olur spark-submit
. Spark belgelerinde bu belirtilmiştir:
Bayrak olarak veya özellikler dosyasında belirtilen tüm değerler uygulamaya aktarılır ve SparkConf aracılığıyla belirtilen değerlerle birleştirilir. Doğrudan SparkConf üzerinde ayarlanan özellikler en yüksek önceliğe sahiptir , daha sonra kıvılcım-gönder veya kıvılcım kabuğuna geçirilen bayraklar, ardından spark-defaults.conf dosyasındaki seçenekler
Bu nedenle, bu değerleri doğru yerlerde ayarladığınızdan emin olun, böylece biri diğerine göre öncelik kazandığında şaşırmazsınız.
Söz konusu her seçeneği analiz edelim:
--jars
vs SparkContext.addJar
: Bunlar aynı, yalnızca bir tanesi kıvılcım gönderimi ve diğeri kodla ayarlanır. Size daha uygun olanı seçin. Dikkat edilmesi gereken önemli bir nokta, bu seçeneklerden herhangi birinin kullanılmasının JAR'ı sürücü / yönetici sınıf yolunuza eklememesi, bunları kullanarakextraClassPath
, her ikisinde de yapılandırmayı .
SparkContext.addJar
vs SparkContext.addFile
: Bağımlılığınız olduğunda ilkini kullanın kullanılması . İkincisini, yalnızca kodunuzda çalışma zamanı bağımlılığı olmayan, çalışan düğümlerinize rasgele bir dosya iletmek istediğinizde kullanın.
--conf spark.driver.extraClassPath=...
veya --driver-class-path
: Bunlar takma adlar, hangisini seçtiğiniz önemli değil
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
Yukarıdaki ile aynı, takma adlar.
--conf spark.executor.extraClassPath=...
: Bir uber JAR'a eklenemeyen bir bağımlılığınız varsa (örneğin, kütüphane sürümleri arasında derleme zamanı çakışmaları olduğu için) ve çalışma zamanında yüklemeniz gereken bu bağımlılığı kullanın.
--conf spark.executor.extraLibraryPath=...
Bu, java.library.path
JVM için seçenek olarak geçirilir . JVM tarafından görülebilir bir kütüphane yoluna ihtiyacınız olduğunda bunu kullanın.
Basitlik için, aynı anda 3 ana seçeneği kullanarak ek uygulama jar dosyaları ekleyebileceğimi varsaymak güvenli olur mu?
Bunu yalnızca Küme modu için değil, yalnızca İstemci modu için kabul edebilirsiniz. Daha önce de söylediğim gibi. Ayrıca, verdiğiniz örnekte gereksiz argümanlar var. Örneğin, JAR'ları --driver-library-path
geçmek işe yaramazsa, extraClassPath
sınıf yolunuzda olmalarını istiyorsanız onları geçirmeniz gerekir. Nihayetinde, hem sürücü hem de çalışan için harici JAR'lar dağıtırken yapmak istediğiniz şey:
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