Spark | 記錄下Spark作業執行時常見的參數屬性配置

 

理解作業基本原理,是進行Spark作業資源參數調優的基本前提。Spark作業基礎概念與運行流程

以下記錄下常見參數配置:

 

Spark Core

num-executors:用於設置Spark作業總共要用多少個Executor進程來執行。Driver在向YARN集羣資源管理器申請資源時,YARN會盡可能按照該屬性值來在集羣的各個工作節點上啓動相應數量的Executor進程。如果不設置,默認只會啓動少量的Executor進程,可能導致Spark作業運行速度非常慢。

executor-memory:用於設置每個Executor進程的內存。注意,num-executors * executor-memory的值是不能超過指定資源隊列的最大內存值。一般情況下最好不要超過資源隊列最大總內存的1/3~1/2,避免Spark作業佔用了隊列所有的資源。


executor-cores:用於設置每個Executor進程的CPU core數量。該屬性值決定了每個Executor進程並行執行Task線程的能力。因爲每個CPU core同一時間只能執行一個task線程,因此每個Executor進程的CPU core數量越多,越能夠快速地執行完分配給自己的所有task線程。
注意,需要根據資源隊列的最大CPU core數,再依據設置的Executor數量,來決定每個Executor進程可以分配到幾個CPU Core。一般情況下建議num-executors * executor-cores不要超過隊列總CPU core的1/3~1/2。

Yarn集羣能夠最多並行的Task數爲 spark.executor.instances * executor-cores。


driver-memory:用於設置Driver進程的內存。注意:如果需要將RDD的數據全部拉取到Driver上進行處理,那麼必須確保Driver的內存足夠大,否則會出現OOM內存溢出的問題。例如collect算子。

spark.executor.instances:該參數決定了yarn集羣中,最多能夠同時啓動的EXECUTOR的實例個數。Yarn中實際能夠啓動的最大Executors的數量會小於等於該值。如果不能確定最大能夠啓動的Executors數量,建議將該值先設置的足夠大。(就是設置儘量大)


spark.default.parallelism:用於設置每個stage的默認task數量。注意,Spark作業的默認task數量爲500~1000個較爲合適。如果不設置該參數那麼就會導致Spark根據底層HDFS的block數量來設置task的數量,默認是一個HDFS block對應一個task。通常來說,Spark默認設置的數量是偏少的(比如就幾十個task),如果task數量偏少的話,就會導致前面設置好的Executor的參數都前功盡棄。既可能存在部分Executor進程可能根本就沒有task執行,也就是白白浪費了資源!因此Spark官網建議的設置原則是,設置該參數爲num-executors * executor-cores的2~3倍較爲合適,比如Executor的總CPU core數量爲300個,那麼設置1000個task是可以的,此時可以充分地利用Spark集羣的資源。


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


spark.shuffle.memoryFractions:用於設置shuffle過程中一個task拉取到上個stage的task的輸出後,進行聚合操作時能夠使用的Executor內存的比例,默認是0.2。也就是說,Executor默認只有20%的內存用來進行該操作。shuffle操作在進行聚合時,如果發現使用的內存超出了這個20%的限制,那麼多餘的數據就會溢寫到磁盤文件中去,此時就會極大地降低性能。
注意,如果Spark作業中的RDD持久化操作較少,shuffle操作較多時,建議降低持久化操作的內存佔比,提高shuffle操作的內存佔比比例,避免shuffle過程中數據過多時內存不夠用,必須溢寫到磁盤上,降低了性能。此外,如果發現作業由於頻繁的gc導致運行緩慢,意味着task執行用戶代碼的內存不夠用,那麼同樣建議調低這個參數的值。

 

Spark Streaming

 

Spark SQL

 

 


spark-submit \
 --master yarn \
 --deploy-mode client \
 --driver-memory 2G \
 --queue gis \
 --num-executors 6 \
 --executor-cores 6 \
 --executor-memory 8G \
 --class com.test.AnalysisDiffElevator \
 --verbose \

  --conf spark.default.parallelism=1000 \
 ./test-1.0-SNAPSHOT.jar

 


spark.sql.queryExecutionListeners,org.apache.spark.sql.hive.DagUsageListener

spark.hadoop.yarn.timeline-service.enabled,false
spark.driver.memory,2G
spark.executor.memory,8G
spark.executor.instances,6
spark.eventLog.enabled,true

spark.sql.result.partition.ratio,0.8
spark.serializer,org.apache.spark.serializer.KryoSerializer
spark.yarn.executor.memoryOverhead,2G
spark.kryoserializer.buffer.max,1111m
spark.submit.deployMode,client
spark.driver.maxResultSize,1111
spark.extraListeners,org.apache.spark.sql.hive.DagUsageListener
spark.master,yarn
spark.port.maxRetries,999
spark.executor.cores,6

 

待續補充。。。。

 

 

https://www.cnblogs.com/hejunhong/p/12571690.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章