Bir Kıvılcım İşine kavanozlar ekleyin - kıvılcım gönder


158

Doğru ... çok tartışıldı.

Ancak çok fazla belirsizlik ve verilen cevaplardan bazıları var ... kavanoz / yürütücü / sürücü yapılandırmasında veya seçeneklerinde kavanoz referanslarını çoğaltmak da dahil.

Belirsiz ve / veya atlanan ayrıntılar

Her bir seçenek için aşağıdaki belirsizlik, net olmayan ve / veya atlanan ayrıntılar açıklığa kavuşturulmalıdır:

  • ClassPath nasıl etkilenir
    • sürücü
    • Yönetici (çalışan görevler için)
    • Her ikisi de
    • bir şey değil
  • Ayırma karakteri: virgül, iki nokta üst üste, noktalı virgül
  • Sağlanan dosyalar otomatik olarak dağıtılırsa
    • görevler için (her uygulayıcıya)
    • Uzak Sürücü için (küme modunda çalıştırıldıysa)
  • kabul edilen URI türü: yerel dosya, hdfs, http, vb.
  • Kopyalanan Eğer içine o konumdur ortak bir yerde, (HDF'ler, yerel?)

Etkilediği seçenekler:

  1. --jars
  2. SparkContext.addJar(...) yöntem
  3. SparkContext.addFile(...) yöntem
  4. --conf spark.driver.extraClassPath=... veya --driver-class-path ...
  5. --conf spark.driver.extraLibraryPath=...veya --driver-library-path ...
  6. --conf spark.executor.extraClassPath=...
  7. --conf spark.executor.extraLibraryPath=...
  8. unutmamak için, kıvılcım gönderiminin son parametresi de bir .jar dosyasıdır.

Ana kıvılcım belgelerini nerede bulabileceğimi ve özellikle nasıl gönderileceğimi , mevcut seçenekleri ve ayrıca JavaDoc'u bulabileceğimin farkındayım . Ancak bu kısmen benim için hala oldukça bazı delikler bıraktı.

Umarım hepsi bu kadar karmaşık değildir ve birisi bana açık ve özlü bir cevap verebilir.

Belgelerden tahmin edersem --jars, ve SparkContext addJarve addFileyöntemler otomatik olarak dosyaları dağıtacak olanlar gibi görünüyor , diğer seçenekler sadece ClassPath değiştirir.

Basitlik için, aynı anda 3 ana seçeneği kullanarak ek uygulama jar dosyaları ekleyebileceğimi varsaymak güvenli olur mu:

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

Başka bir gönderinin cevabı üzerine güzel bir makale buldu . Ancak yeni bir şey öğrenmedi. Poster, Yerel sürücü (iplik istemcisi) ile Uzak Sürücü (iplik kümesi) arasındaki farkı iyi bir şekilde açıklamaktadır. Akılda tutulması kesinlikle önemlidir.


1
Hangi küme yöneticisi altında çalışıyorsunuz? Bağımsız / İPLİK / Mesos?
Yuval Itzchakov

Hiç. Bunu orijinal belgelere bir açıklama olarak düşünüyorum. Çoğunlukla bağımsız küme, tek örnek, iplik-istemci, iplik kümesi kullanıyorum. Diğerleri Mesos kullanıyor olabilir. Bu konuda blogunuzda iyi bir orijinal araştırma yaptınız gibi görünüyor . Sonunda sizinle aynı şeyi yaptım - dağıtım sürecimi basitleştirmek için bir Uber kavanozu oluşturmak için bir gölgelendirici kullanarak.
YoYo

1
Spark Standalone'u nasıl kullandığımızla ilgili birkaç cevap verebilecek bir cevap göndereceğim.
Yuval Itzchakov

6
Tüm sorularınızı cevaplamak için çaba gösterdim. Umarım yardımcı olur :)
Yuval Itzchakov

@Yuval Itzchakov, tıpkı Yoyo'nun bahsettiği gibi, ben de vaka sınıfları ve kullanabileceğim diğer kavanozlar gibi tüm bağımlılıklarımı toplamak için gölgeli bir kavanoz kullanıyorum. Birden fazla kavanoza ihtiyacım olan bir durumda ne zaman karşılaşacağımı anlamaya çalışıyorum. Yani her zaman bu çoklu kavanozları 1 uber kavanoza koyabilirim. Neden tüm bağımlılıklarımı toplayan gölgeli kavanozlarla yaşamaya devam edemiyorum?
Sheel Pancholi

Yanıtlar:


177

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:

  1. İ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
  2. 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/workbö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:

  • --jarsvs 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.addJarvs 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.pathJVM 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-pathgeçmek işe yaramazsa, extraClassPathsı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

4
Harika ve kapsamlı bir cevap. Teşekkür ederim. Ayrıca birlikte dağıtımında daha iyi uygulamalar hakkında bilgi verebilir misiniz uber JAR vs. dış JAR bağımlılıkları (dış klasördeki kütüphanelerini ve listelenen MANIFEST.MFdosyası)?
jsosnowski

2
@jsosnowski Genellikle, sadece uber JAR'ım ile çözülmesi çok karmaşık çatışmalar olduğunda dış kavanozları kullanmayı ertelerim. Genellikle sadece SBT'leri kullanarak assemblyMergeStrategyve çakışmalar varsa ihtiyacım olan sınıfları seçerek elde ederim. Genelde aynısını öneririm.
Yuval Itzchakov

9
@ yuval-itzchakov Harika cevap için teşekkürler, çok yararlı. Bir nokta, benimle aynı hatayı yapan diğer insanlara yardım etmek için vurgulamak istiyorum. --Jars bağımsız değişkeni, kavanozları yalnızca kümedeki her makineye aktarır. Kıvılcımları sınıf yolu aramasında kullanmalarını SÖYLEMİYOR. --Driver-class-path (veya benzer bağımsız değişkenler veya yapılandırma parametreleri) de gereklidir. Başlangıçta, aynı şeyi yapmanın alternatif yolları olduğunu düşündüm.
Tim Ryan

1
@TimRyan Kesinlikle. Cevabın son kısmına bakarsanız, kavanozları hem --jarsbayrağa hem de sürücü / uygulayıcı sınıfı yoluna geçiririm.
Yuval Itzchakov

1
Sonunda buldum nasıl enjekte içine ortam değişkenleri zeppelin-env.shve katma --jarsetmek SPARK_SUBMIT_OPTIONS. İşe yaradı. Kullandığım URI biçimi --jars=local:///mnt/dir/file.jar.
Mike

4

Başka bir yaklaşım spark 2.1.0kullanmaktır --conf spark.driver.userClassPathFirst=truekullanıcı ile sınıf-yolu ekliyor kavanoz öncelik vererek, kıvılcım-iş davranışını bağımlılık yükünün öncelikli değişiklikleri ve dolayısıyla hangi gönderin kıvılcım esnasında --jarsseçeneği.


2
Buna dikkat etmelisiniz - kıvılcımı kırmak mümkün olduğu için. Bu son seçenek bir çözüm olmalıdır. Her ne kadar emin olmasam da, iplik istemcisi modunda kullanıldığında ipliğin yanı sıra katmanla da etkileşime girebilir.
YoYo

Uyarı için teşekkür ederim. Sadece 1 kavanoza öncelik vermenin herhangi bir yolu var mı, bu sunucuda kesinlikle eski bir sürümde var, ancak fiziksel olarak değiştiremezsiniz ve kullanmak istemediğinizi biliyor musunuz?
Stanislav

1
Sanırım bu durumda tam olarak önerdiğin gibi deneyebilirsin. Mutlak bir hayır olduğunu söylemedim. Ayrıca seçeneğin 'deneysel' olarak işaretlendiğini unutmayın - dikkat edilmesi gereken bir uyarı! Bir kütüphanenin bir versiyonunu diğerine göre önceliklendirmenin güvenli bir yolu yoktur. Bazı uygulamalarda bu, kütüphanelerden birini farklı bir ad alanında taşıyarak çözülür, böylece her iki sürümü de aynı anda kullanabilirsiniz.
YoYo

1

yarnDağıtım modu olması durumunda kavanozlar ve sınıf yolu ile ilgili diğer yapılandırılabilir Spark seçenekleri aşağıdaki gibidir:
Spark belgelerinden,

spark.yarn.jars

YARN kaplarına dağıtmak için Spark kodunu içeren kitaplıkların listesi. Varsayılan olarak, Spark on YARN yerel olarak kurulan Spark kavanozlarını kullanır, ancak Spark kavanozları HDFS'de dünya tarafından okunabilir bir konumda olabilir. Bu, İPLİK'in düğümlerde önbelleğe almasını sağlar, böylece bir uygulama her çalıştığında dağıtılmasına gerek kalmaz. Örneğin, HDFS'deki kavanozlara işaret etmek için bu yapılandırmayı hdfs: /// some / path olarak ayarlayın. Globlara izin verilir.

spark.yarn.archive

YARN önbelleğine dağıtım için gerekli Spark kavanozlarını içeren bir arşiv. Ayarlanırsa, bu yapılandırma spark.yarn.jars'ın yerini alır ve arşiv uygulamanın tüm kaplarında kullanılır. Arşiv, kök dizininde jar dosyaları içermelidir. Önceki seçenekte olduğu gibi, dosya dağıtımını hızlandırmak için arşiv HDFS'de de barındırılabilir.

Kullanıcılar bu parametreyi, sürücünün Spark sürücüsünün sınıfyoluna dahil edilen kavanozlarını belirtmek için yapılandırabilir.


1

--Master iplik kümesi ile 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. --Jar'lardan sonra sağlanan URL'ler virgülle ayrılmalıdır. Bu liste sürücü ve yürütücü sınıfyollarında bulunur

Misal :

kıvılcım gönder - master iplik kümesi - jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar

https://spark.apache.org/docs/latest/submitting-applications.html


0

Kullanım kısıtlaması vardır --jars: jar/xmldosyanın konumu için bir dizin belirtmek isterseniz , dizin genişletmelerine izin vermez. Bu, her kavanoz için mutlak yol belirtmeniz gerektiği anlamına gelir.

Eğer belirlerseniz --driver-class-pathve iplik kümesi modunda çalıştırıyorsanız, sürücü sınıfı güncellenmez. Sınıf yolunun güncellenmiş olup olmadığını sekme ortamında spark ui veya spark geçmişi sunucusu altında olup olmadığını doğrulayabiliriz.

Dizin genişletmeleri içeren ve iplik küme modunda çalışan kavanozları geçmeme yarayan --confseçenek seçimdi. Sürücü ve yönetici sınıfı yollarını --conf, oturum nesnesinin kendisine kıvılcım ekleyen ve bu yollar Kıvılcım Yapılandırması'na yansıtıldığı gibi iletmek daha iyidir . Ancak lütfen kavanozları küme boyunca aynı yola koyduğunuzdan emin olun.

spark-submit \
  --master yarn \
  --queue spark_queue \
  --deploy-mode cluster    \
  --num-executors 12 \
  --executor-memory 4g \
  --driver-memory 8g \
  --executor-cores 4 \
  --conf spark.ui.enabled=False \
  --conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapred.output.dir=/tmp \
  --conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp

Yeni Yılınız mutlu olsun!
YoYo

Yeni Yılınız Kutlu
Olsun

0

Kıvılcım gönderme yardımcı programını kullanarak kıvılcım işleri gönderirken, bir seçenek var --jars. Bu seçeneği kullanarak jar dosyasını kıvılcım uygulamalarına geçirebiliriz.


Bu —jarseçeneğin orijinal poster tarafından belirtildiği, ayrıca birden fazla cevapla daha ayrıntılı olarak tartışıldığı belirtildi. Yeni bir şey sağladığınız anlaşılıyor mu?
YoYo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.