spark submit參數及調優


1. spark submit參數介紹

你可以通過 spark-submit --help或者 spark-shell --help來查看這些參數。
使用格式: 
 
./bin/spark-submit \
  --class <main-class> \
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  # other options
  <application-jar> \
  [application-arguments]

參數說明

--master  MASTER_URL 如spark://host:port, mesos://host:port, yarn,  yarn-cluster,yarn-client, local
--deploy-mode DEPLOY_MODE Client或者master,默認是client
--class CLASS_NAME 應用程序的主類
--name NAME 應用程序的名稱
--jars JARS  逗號分隔的本地jar包,包含在driver和executor的classpath下
--packages  包含在driver和executor的classpath下的jar包逗號分隔的”groupId:artifactId:version”列表
--exclude-packages  用逗號分隔的”groupId:artifactId”列表
--repositories  逗號分隔的遠程倉庫
--py-files  PY_FILES  逗號分隔的”.zip”,”.egg”或者“.py”文件,這些文件放在python app的PYTHONPATH下面
--files FILES 逗號分隔的文件,這些文件放在每個executor的工作目錄下面
--conf PROP=VALUE 固定的spark配置屬性,默認是conf/spark-defaults.conf
--properties-file  FILE  加載額外屬性的文件
--driver-memory MEM  Driver內存,默認1G
--driver-java-options  傳給driver的額外的Java選項
--driver-library-path  傳給driver的額外的庫路徑
--driver-class-path  傳給driver的額外的類路徑
--executor-memory MEM  每個executor的內存,默認是1G
--proxy-user NAME 模擬提交應用程序的用戶
--driver-cores NUM  Driver的核數,默認是1。這個參數僅僅在standalone集群deploy模式下使用
--supervise  Driver失敗時,重啟driver。在mesos或者standalone下使用
--verbose  打印debug信息
--total-executor-cores NUM  所有executor總共的核數。僅僅在mesos或者standalone下使用
--executor-core NUM  每個executor的核數。在yarn或者standalone下使用
--driver-cores NUM  Driver的核數,默認是1。在yarn集群模式下使用
--queue QUEUE_NAME 隊列名稱。在yarn下使用
--num-executors NUM  啟動的executor數量。默認為2。在yarn下使用

 

2. Examples

#EX01  Run application locally on 8 cores(本地模式8核)
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master local[8] \
  /path/to/examples.jar \
  100
 

#EX02 Run on a Spark standalone cluster in client deploy mode(standalone client模式)
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://207.184.161.138:7077 \
  --executor-memory 20G \
  --total-executor-cores 100 \
  /path/to/examples.jar \
  1000
 

#EX03 Run on a Spark standalone cluster in cluster deploy mode with supervise(standalone cluster模式使用supervise)
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://207.184.161.138:7077 \
  --deploy-mode cluster \
  --supervise \
  --executor-memory 20G \
  --total-executor-cores 100 \
  /path/to/examples.jar \
  1000
 

#EX04 Run on a YARN cluster(YARN cluster模式)
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master yarn \
  --deploy-mode cluster \  # can be client for client mode
  --executor-memory 20G \
  --num-executors 50 \
  /path/to/examples.jar \
  1000
 

#EX05 Run on a Mesos cluster in cluster deploy mode with supervise(Mesos cluster模式使用supervise)
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master mesos://207.184.161.138:7077 \
  --deploy-mode cluster \
  --supervise \
  --executor-memory 20G \
  --total-executor-cores 100 \
  http://path/to/examples.jar \
  1000

 

3. spark on yarn

所謂的Spark資源參數調優,其實主要就是對Spark運行過程中各個使用資源的地方,通過調節各種參數,來優化資源使用的效率,從而提升Spark作業的執行性能。
以下參數就是Spark中主要的資源參數,每個參數都對應着作業運行原理中的某個部分,我們同時也給出了一個調優的參考值。

3.1 num-executors

參數說明:
該參數用於設置Spark作業總共要用多少個Executor進程來執行。Driver在向YARN集群管理器申請資源時,YARN集群管理器會盡可能按照你的設置來在
集群的各個工作節點上,啟動相應數量的Executor進程。這個參數非常之重要,如果不設置的話,默認只會給你啟動少量的Executor進程,此時你的
Spark作業的運行速度是非常慢的。
 
參數調優建議:
每個Spark作業的運行一般設置50~100個左右的Executor進程比較合適,設置太少或太多的Executor進程都不好。設置的太少,無法充分利用集群資源;
設置的太多的話,大部分隊列可能無法給予充分的資源。
 

3.2 executor-memory

參數說明:
該參數用於設置每個Executor進程的內存。Executor內存的大小,很多時候直接決定了Spark作業的性能,而且跟常見的JVM OOM異常,也有直接的關聯。
 
參數調優建議:
每個Executor進程的內存設置4G~8G較為合適。但是這只是一個參考值,具體的設置還是得根據不同部門的資源隊列來定。可以看看自己團隊的資源隊列
的最大內存限制是多少,num-executors乘以executor-memory,是不能超過隊列的最大內存量的。此外,如果你是跟團隊里其他人共享這個資源隊列,
那么申請的內存量最好不要超過資源隊列最大總內存的1/3~1/2,避免你自己的Spark作業占用了隊列所有的資源,導致別的同學的作業無法運行。
 

3.3 executor-cores

參數說明:
該參數用於設置每個Executor進程的CPU core數量。這個參數決定了每個Executor進程並行執行task線程的能力。因為每個CPU core同一時間只能執行一個
task線程,因此每個Executor進程的CPU core數量越多,越能夠快速地執行完分配給自己的所有task線程。
 
參數調優建議:
Executor的CPU core數量設置為2~4個較為合適。同樣得根據不同部門的資源隊列來定,可以看看自己的資源隊列的最大CPU core限制是多少,再依據設置的
Executor數量,來決定每個Executor進程可以分配到幾個CPU core。同樣建議,如果是跟他人共享這個隊列,那么num-executors * executor-cores不要超過
隊列總CPU core的1/3~1/2左右比較合適,也是避免影響其他同學的作業運行。
 

3.4 driver-memory

參數說明:
該參數用於設置Driver進程的內存。
 
參數調優建議:
Driver的內存通常來說不設置,或者設置1G左右應該就夠了。唯一需要注意的一點是,如果需要使用collect算子將RDD的數據全部拉取到Driver上進行處理,
那么必須確保Driver的內存足夠大,否則會出現OOM內存溢出的問題。
 

3.5 spark.default.parallelism

參數說明:
該參數用於設置每個stage的默認task數量。這個參數極為重要,如果不設置可能會直接影響你的Spark作業性能。
 
參數調優建議:
Spark作業的默認task數量為500~1000個較為合適。很多同學常犯的一個錯誤就是不去設置這個參數,那么此時就會導致Spark自己根據底層HDFS的block數量
來設置task的數量,默認是一個HDFS block對應一個task。通常來說,Spark默認設置的數量是偏少的(比如就幾十個task),如果task數量偏少的話,就會
導致你前面設置好的Executor的參數都前功盡棄。試想一下,無論你的Executor進程有多少個,內存和CPU有多大,但是task只有1個或者10個,那么90%的
Executor進程可能根本就沒有task執行,也就是白白浪費了資源!因此Spark官網建議的設置原則是,設置該參數為num-executors * executor-cores的2~3倍
較為合適,比如Executor的總CPU core數量為300個,那么設置1000個task是可以的,此時可以充分地利用Spark集群的資源。
 

3.6 spark.storage.memoryFraction

參數說明:
該參數用於設置RDD持久化數據在Executor內存中能占的比例,默認是0.6。也就是說,默認Executor 60%的內存,可以用來保存持久化的RDD數據。根據你選擇
不同的持久化策略,如果內存不夠時,可能數據就不會持久化,或者數據會寫入磁盤。
 
參數調優建議:
如果Spark作業中,有較多的RDD持久化操作,該參數的值可以適當提高一些,保證持久化的數據能夠容納在內存中。避免內存不夠緩存所有的數據,導致數據只
能寫入磁盤中,降低了性能。但是如果Spark作業中的 shuffle類操作比較多,而持久化操作比較少,那么這個參數的值適當降低一些比較合適。此外,如果發現
作業由於頻繁的gc導致運行緩慢(通過spark web ui可以觀察到作業的gc耗時),意味着task執行用戶代碼的內存不夠用,那么同樣建議調低這個參數的值。
 

3.7 spark.shuffle.memoryFraction

參數說明:
該參數用於設置shuffle過程中一個task拉取到上個stage的task的輸出后,進行聚合操作時能夠使用的Executor內存的比例,默認是0.2。也就是說,Executor
默認只有20%的內存用來進行該操作。shuffle操作在進行聚合時,如果發現使用的內存超出了這個20%的限制,那么多余的數據就會溢寫到磁盤文件中去,此時
就會極大地降低性能。
 
參數調優建議:
如果Spark作業中的 RDD持久化操作較少,shuffle操作較多時,建議降低持久化操作的內存占比,提高shuffle操作的內存占比比例,避免shuffle過程中數據過多
時內存不夠用,必須溢寫到磁盤上,降低了性能。此外,如果發現作業由於頻繁的gc導致運行緩慢,意味着task執行用戶代碼的內存不夠用,那么同樣建議調低
這個參數的值。
 
資源參數的調優,沒有一個固定的值,需要根據自己的實際情況(包括Spark作業中的shuffle操作數量、RDD持久化操作數量以及spark web ui中顯示的作業gc情況),
合理地設置上述參數。
資源參數參考示例
以下是一份spark-submit命令的示例,大家可以參考一下,並根據自己的實際情況進行調節:
./bin/spark-submit \
  --master yarn-cluster \
  --num-executors 100 \
  --executor-memory 6G \
  --executor-cores 4 \
  --driver-memory 1G \
  --conf spark.default.parallelism=1000 \
  --conf spark.storage.memoryFraction=0.5 \
  --conf spark.shuffle.memoryFraction=0.3 \

 

 

reference

https://www.cnblogs.com/hanhaotian/p/10748476.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM