1. 程式人生 > >Spark on yarn模式的引數設定即調優

Spark on yarn模式的引數設定即調優

1 啟動方式

  1. 執行命令./spark-shell --master yarn預設執行的是client模式。
  2. 執行./spark-shell --master yarn-client或者./spark-shell --master yarn --deploy-mode client執行的也是client。
  3. 執行./spark-shell --master yarn-cluster或者./spark-shell --master yarn --deploy-mode cluster執行的是cluster模式。(自己是是可行嗎?後面講解)

2 spark.yarn.jars引數

spark on yarn模式,預設情況下會讀取spark本地的jar包(再jars目錄下)分配到yarn的containers中,我們可以觀察使用spark-shell啟動時的日誌:

18/04/21 09:31:45 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
18/04/21 09:32:04 INFO Client: Uploading resource file:/tmp/spark-a02aba59-216a-4f48-90ad-1feac7ef3ca3/__spark_libs__1710985531662084339.zip -> hdfs://192.168.137.130:9000/user/hadoop/.sparkStaging/application_1524244764594_0002/__spark_libs__1710985531662084339.zip
18/04/21 09:32:11 INFO Client: Uploading resource file:/tmp/spark-a02aba59-216a-4f48-90ad-1feac7ef3ca3/__spark_conf__9148717454674942843.zip -> hdfs://192.168.137.130:9000/user/hadoop/.sparkStaging/application_1524244764594_0002/__spark_conf__.zip

這樣每次啟動會很慢,讀取很多東西,可以通過spark.yarn.jars引數指定放在hdfs上;
調優

官網提供了一個引數spark.yarn.jars預設是沒有設定的,我們看看官網給我們的解釋:

預設情況下會把Spark中的jars目錄裡面的jar包通過本地上傳,但是這樣不能達到一個公用的效果每次提交job都要去從本地上傳,所有我們可以設定全域性的把它放置在一個公用的地方這樣每次應用程式執行時都不需要分發它。例如,要指向HDFS上的jar,請將此配置設定為hdfs:/// some / path。 可以共用。
把jars目錄下的jar包上傳到hdfs
[[email protected]
spark-2.2.0-bin-2.6.0-cdh5.7.0]$ hdfs dfs -mkdir -p /spark/jars [[email protected] spark-2.2.0-bin-2.6.0-cdh5.7.0]$ hdfs dfs -put jars/ /spark/jars conf目錄下: vi spark-defaults.conf spark.yarn.jars hdfs:///spark/jars/jars/*

注意: hdfs:///spark/jars/jars/* 如果不加/*就會報錯的。

3 簡化啟動spark on yarn的命令

啟動spark on yarn的命令:spark-shell --master yarn --jars mysql驅動包絕對路徑
感覺是不是很麻煩,可以修改conf目錄下的spark-defaults.conf配置檔案。

官方引數:所有引數我們都可以去官網查詢,其實最全的還是在原始碼中我們的SparkSubmitArguments這個類。有興趣的同學可以去原始碼中看看。

新增下面配置:
spark.executor.extraClassPath  mysql驅動包絕對路徑
spark.driver.extraClassPath  mysql驅動包絕對路徑
spark.master yarn

這裡executor和driver都要加,因為我們通過--jars設定的話,預設是給我們加到executor和driver,所以都要同時加,否則會把找不到驅動的錯誤

注意:

  1. 當某個jar包啊或者某個類找不到的時候,都可以用這種方式手動指定類或jar包的路徑。
  2. 如果設定spark.master local[2] 即為local模式。
  3. 如果不想再spark-defaults.conf配置檔案檔案中加入jar包,可以直接丟入jars目錄下(個人感覺應該沒啥區別)。
  4. 某些版本可能存在問題,一般executor,driver要同時設定,要不然可能報錯。

4 自定義配置檔案

對於3上面說的修改spark-defaults.conf大家有什麼想法呢?
首相spark-defaults.conf是一個全域性的配置檔案,要是存在多個業務線該怎麼辦呢?,這時候我們可以使用--properties-file引數可以根據不同的業務線自定義配置檔案,如果沒有設定該引數那麼就通過spark-defaults.conf這個配置檔案中去查詢。(實現原理就是scala中的預設引數default)

cp spark-defaults.conf spark-yarn.conf
進行修改

執行:
spark-shell --properties-file /opt/software/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/spark-yarn.conf

5 spark.port.maxRetries

spark對於同時執行的作業數目是有限制,該限制由參spark.port.maxRetries決定,該引數預設值為16,表明同一時間執行的作業最多為17個我們可以更改這一數字,具體做法如下:

vi spark-default.cong  新增
spark.port.maxRetries  ${業務所需要的數值}

6 自定義屬性

/spark-shell --master yarn --conf spark.屬性=值

注意: 這裡必須以spark開頭,有興趣的小夥伴可以到原始碼中找到答案。

7 spark.yarn.maxAppAttempts

該屬性用來設定作業最大重試次數。預設情況應該是偏小的適當放大