[Spark08]Spark on Yarn 詳解
1、spark on yarn有兩種模式,一種是cluster模式,一種是client模式。
a.執行命令“./spark-shell --master yarn”預設執行的是client模式。
b.執行"./spark-shell --master yarn-client"或者"./spark-shell --master yarn --deploy-mode client"執行的也是client。
c.執行"./spark-shell --master yarn-cluster"或者"./spark-shell --master yarn --deploy-mode cluster"執行的是cluster模式。
##但是,以上兩個啟動cluster模式的命令是不可用的,這就牽涉到這兩種模式的區別。
d.client和cluster模式的主要區別在於,前者的driver是執行在客戶端程序中,後者的driver是執行在NodeManager的ApplicationMaster之中。我們知道,driver是負責分發作業的,執行在ApplicationMaster裡的driver是無法直接與客戶端進行通訊的,故而c中所提到的兩條命令不可用。
##對應的spark-sql中的一些命令也是不可用的。
注:生產上我們通常使用spark on yarn-cluster模式,由於client模式的driver在客戶端上,客戶端可能與executor不在同一區域網,他們之間的通訊會很慢。
2、spark on yarn的兩種模式的詳細介紹
http://blog.csdn.net/lw_ghy/article/details/50859346
http://blog.csdn.net/shenxiaoming77/article/details/54630675
3、提交作業的方式
./bin/spark-submit --class org.apache.spark.examples.SparkPi \ #作業類名 --master yarn \ #spark模式 --deploy-mode cluster \ #spark on yarn 模式 --driver-memory 4g \ #每一個driver的記憶體 --executor-memory 2g \ #每一個executor的記憶體
--executor-cores 1 \ #每一個executor佔用的core數量 --queue thequeue \ #作業執行的佇列 examples/jars/spark-examples*.jar \ #jar包 10 #傳入類中所需要的引數
4、提交作業時yarn會將spark jars分發到yarn的container中,這十分耗費資源,故而我們可以將spark jars放在一個yarn可以訪問到的目錄中,具體做法如下:
vi spark-default.cong 新增
spark.yarn.jars hdfs://ip:8021/somepath/*
儲存生效,並將所有的spark jars上傳至hdfs://ip:9000/somepath/即可。
4所說的是一個調優點哦
5、spark對於同時執行的作業數目有一定的限制,該限制由引數"spark.port.maxRetries"決定,該引數預設值為16,表明同一時間執行的作業最多為17個(不是16個哦),生產上16肯定太小,我們可以更改這一數字,具體做法如下:
vi spark-default.cong 新增
spark.port.maxRetries ${業務所需要的數值}
6、啟動spark on yarn的命令:“/spark-shell --master yarn --jars mysql驅動包絕對路徑”
是不是超級麻煩,來來來,大佬幫你們簡化
vi spark-defaults.cong 新增
spark.executor.extraClassPath mysql驅動包絕對路徑
spark.driver.extraClassPath mysql驅動包絕對路徑
儲存生效,則啟動命令變成:“/spark-shell --master yarn ”
####當某個jar包啊或者某個類找不到的時候,都可以用這種方式手動指定類或jar包的路徑
繼續簡化,vi spark-defaults.cong
該配置檔案中有一行“#spark.master local[3]”,將#去掉,將local[3]改成yarn即可。
儲存生效,則啟動命令變成:“/spark-shell ”
7、但是,6中這種對於spark-defaults.conf的修改,會作用於其他的spark模式,這樣容易產生一些問題。
那怎麼做呢?
我們可以將spark-defaults.conf.template拷貝一份(當然啦,你拷貝spark-defaults.conf也行,只要spark-defaults.conf這個配置檔案定義生效的引數你用的到),你命名成什麼名字都行,接著在該配置檔案中個性化定義你的屬性。然後以命令“/spark-shell --properties-file ${你拷貝的配置檔案絕對路徑}”即可。
8、另一種傳入屬性的方法:
“/spark-shell --master yarn --conf spark.屬性=值”
9、其他重要的屬性
spark.yarn.maxAppAttempts
該屬性用來設定作業最大重試次數,它不應該大於yarn配置中設定的全域性最大重試數。預設是等於的。