1. 程式人生 > >Spark on Yarn 詳解(轉)

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的兩種模式的詳細介紹

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配置中設定的全域性最大重試數。預設是等於的。