Spark #15 : spark-submit



Bir spark job'u spark-submit ile cluster'a gonderildiginde, bir driver program olsuturulur ve onun main metodu calistirilir. spark-submit aslinda spark'in kok dizininde bulunan bin klasordunde yasayan bir scriptciktir. 

Driver programi calistiran process spark-submiti calistiran makinede host edilebilecegi gibi (client mode), cluster uzerindeki bu spark job icin ayrilmis olan master node uzerinde de calisabilir (cluster mode). 

Submit gerceklestikten sonra, driver program, cluster manager'den gerekli resource'lari ister. (kac cpu olacak ne kadar RAM gerekli gibi). Gerekli kaynaklar mevcut ise cluster manager bunlari ayaga kaldirmaya baslar. Daha sonra da driver program'in main metodu calismaya baslar. RDD'ler lazy bir sekilde olusturulur ta ki bir action'a denk gelene kadar. Action, o ana kadar olusturulan execurion dag'in gercekten calistirilmasini saglar. Dag execute edilip de eger geri dondurulecek bir deger var ise (mesela count gibi) driver programa geri donduruldukten sonra, main metodu calismasina devam eder. Ta ki son satira gelinene kadar. Main metot da calismasi bittikten sonra cluster'dan alinan resource'lar serbest birakilir ve spark job'u basariyle tamamlanmis olur. Main metodun sonuna gelmeden once de egere SparkContext'in stop metodu calistirilirsa da resource'lar serbest birakilir. 

Tatavayi birak

> spark-submit --help

seklinde  yardim alabiliriz.

Usage: spark-submit [options] <app jar | python file | R file> [app arguments]
Usage: spark-submit --kill [submission ID] --master [spark://...]
Usage: spark-submit --status [submission ID] --master [spark://...]
Usage: spark-submit run-example [options] example-class [example args]

Birinci satirda bir spark job'u cluster'a gonderme komutunu goruyoruz. Daha sonra ise kill ve status ile zaten calisan job'u durdurabilir veya hakkinda bilgi alabiliriz. Simdi belli basli argumanlara gozatalim:

master
spark://host:port, mesos://host:port, yarn, k8s://https://host:port, or local (Default: local[*]). Goruldugu gibi secenekler mevcut. Bu bizim cluster managerimizin master url'i. Ya da gunumuzde yaygin haliyle yarn kullanacaksak sadece yarn olarak belirtiyoruz ve geri kalan ayarlamalar config dosyalari uzerinden gerceklesiyor. Ayrica local vererek, lokal makinede de calistirabiliriz. Koseli paranterzler icerisinde kac core kullanilabilecegini de belirtebiliriz. Tum core'larin kullanilmasi icin * vermek yeterli.

deploy-mode
Sadece iki secenegimiz var. client veya cluster. 

client: Daha once de bahsettigimiz gibi driver node, spark-submit'in calistirildigi makinede calisacaktir. Ancak bu durumda makine cluster'a surekli bagli kalmalidir, eger internek kesilirse job abort olur cunku driver programla iletisim kesilmis olur. Ayrica hizli bir baglanti gereklidir ki driver - worker iletisimi hizli olsun. Prod icin onerilen bir yontem degildir. 

cluster: Bu durumda bir job'u cluster'a gonderiyoruz ve sonra unutuyoruz. (Fire and forget). Driver program cluster'daki bir node uzerinde calistirilir. Spark-submit'i yapan makine daha sonra baglantisi kopabilir bir sorun teskil etmez. 

class: Calistirilmaya baslanacak olan main metodunu barindiran class. 

name: gonderilen uygulamanin adi. Bu ad ile daha sonra cluster manager arayuzunden (mesela Yarn UI), spark job'umuzu takip edebliriz.

jars, py-files: virgul ile ayrilmis olarak verebilecgimiz dosyalardir. Jar doslayalari driver program ve executor node'larda uyuglamaya import edilecek jarlardir. Tum node'lara bu dosyalar kopyalanir. Ama zaten scala ve java'da tum dependency'leri de iceren fat-jar (veya uberjar) olusturulabilir ve bu sekilde ekstra olarak verilmek zorunda kalinmayabilir. 

packages, repositories: bu argumanlar sayesinde dependency'leri direk node'lara kopyalamak yerine spark-packages.org'dan indirilmelerini saglayabiliriz. Oncelikle lokal maven repo kontrol edilecektir daha sonra central maven repo ve son olarak da custom repositoryler (repositories argumani ile verilmis) taranarak gerekli dependency'ler kurulacaktir. Format, groupId:artifactId:version sekilnde olmalidir. Ozellikle spark-shell'den bazi dependency'leri kullanmak icin kullanisli bir secenektir. 

files: yine virgulla ayrilmis olarak verilebilecek bir dosya listesi. Bu dosyalar tum executor'larda erisilebilecek sekilde cluster'a dagitilacaktir. Bu dosyalara kod icerisinden erismek icin SparkFiles.get metodu kullanilabilir. 

--conf PROP=VALUE sekilde herhangi bir spark configi de spark-submit ile birlikte gonderilebilir. Ya da --properties-file CONFIG-DOSYA seklide bir config dosyasi verilebilir. Bunun default degeri de conf/spark-defaults.conf dosyasidir. 

Son olarak da cluster'dan resource isteme notkasina geliyoruz. 

--driver-memory MEM (100M, 2G gibi)
--executor-memory MEM 
--driver-cores SAYI (sadece cluster mode)
--num-executors SAYI (sadece yarn icin)

argumanlar hayet self-explanatory oldugu icin cok detayli aciklamaya gerek gormuyorum. 

dewamke.

Yorumlar

Bu blogdaki popüler yayınlar

Python'da Multithreading ve Multiprocessing

Threat Modeling 1

Encoding / Decoding