天天看點

spark參數調優

spark參數調優

摘要

  1.num-executors

  2.executor-memory

  3.executor-cores

  4.driver-memory

  5.spark.default.parallelism

  6.spark.storage.memoryFraction

  7.spark.shuffle.memoryFraction

  8.total-executor-cores

  9.資源參數參考示例

内容

1.num-executors

參數說明:該參數用于設定Spark作業總共要用多少個Executor程序來執行。Driver在向YARN叢集管理器申請資源時,YARN叢集管理器會盡可能按照你的設定來在叢集的各個工作節點上,啟動相應數量的Executor程序。這個參數非常之重要,如果不設定的話,預設隻會給你啟動少量的Executor程序,此時你的Spark作業的運作速度是非常慢的。

參數調優建議:每個Spark作業的運作一般設定50~100個左右的Executor程序比較合适,設定太少或太多的Executor程序都不好。設定的太少,無法充分利用叢集資源;設定的太多的話,大部分隊列可能無法給予充分的資源。

2.executor-memory

參數說明:該參數用于設定每個Executor程序的記憶體。Executor記憶體的大小,很多時候直接決定了Spark作業的性能,而且跟常見的JVM OOM異常,也有直接的關聯。

參數調優建議:每個Executor程序的記憶體設定4G~8G較為合适。但是這隻是一個參考值,具體的設定還是得根據不同部門的資源隊列來定。可以看看自己團隊的資源隊列的最大記憶體限制是多少,num-executors乘以executor-memory,是不能超過隊列的最大記憶體量的。此外,如果你是跟團隊裡其他人共享這個資源隊列,那麼申請的記憶體量最好不要超過資源隊列最大總記憶體的1/3~1/2,避免你自己的Spark作業占用了隊列所有的資源,導緻别的同學的作業無法運作。

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左右比較合适,也是避免影響其他同學的作業運作。

4.driver-memory

參數說明:該參數用于設定Driver程序的記憶體。

參數調優建議:Driver的記憶體通常來說不設定,或者設定1G左右應該就夠了。唯一需要注意的一點是,如果需要使用collect算子将RDD的資料全部拉取到Driver上進行處理,那麼必須確定Driver的記憶體足夠大,否則會出現OOM記憶體溢出的問題。

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叢集的資源。

6.spark.storage.memoryFraction

參數說明:該參數用于設定RDD持久化資料在Executor記憶體中能占的比例,預設是0.6。也就是說,預設Executor 60%的記憶體,可以用來儲存持久化的RDD資料。根據你選擇的不同的持久化政策,如果記憶體不夠時,可能資料就不會持久化,或者資料會寫入磁盤。

參數調優建議:如果Spark作業中,有較多的RDD持久化操作,該參數的值可以适當提高一些,保證持久化的資料能夠容納在記憶體中。避免記憶體不夠緩存所有的資料,導緻資料隻能寫入磁盤中,降低了性能。但是如果Spark作業中的shuffle類操作比較多,而持久化操作比較少,那麼這個參數的值适當降低一些比較合适。此外,如果發現作業由于頻繁的gc導緻運作緩慢(通過spark web ui可以觀察到作業的gc耗時),意味着task執行使用者代碼的記憶體不夠用,那麼同樣建議調低這個參數的值。

7.spark.shuffle.memoryFraction

參數說明:該參數用于設定shuffle過程中一個task拉取到上個stage的task的輸出後,進行聚合操作時能夠使用的Executor記憶體的比例,預設是0.2。也就是說,Executor預設隻有20%的記憶體用來進行該操作。shuffle操作在進行聚合時,如果發現使用的記憶體超出了這個20%的限制,那麼多餘的資料就會溢寫到磁盤檔案中去,此時就會極大地降低性能。

參數調優建議:如果Spark作業中的RDD持久化操作較少,shuffle操作較多時,建議降低持久化操作的記憶體占比,提高shuffle操作的記憶體占比比例,避免shuffle過程中資料過多時記憶體不夠用,必須溢寫到磁盤上,降低了性能。此外,如果發現作業由于頻繁的gc導緻運作緩慢,意味着task執行使用者代碼的記憶體不夠用,那麼同樣建議調低這個參數的值。

8.total-executor-cores

參數說明:Total cores for all executors.

9,

--conf spark.yarn.executor.memoryOverhead=2048M

當拉取不到block時使用

--conf spark.network.timeout=600s

spark參數調優

10.資源參數參考示例

以下是一份spark-submit指令的示例:

 ./bin/spark-submit \

--master spark://192.168.1.1:7077 \

--num-executors 100 \

--executor-memory 6G \

--executor-cores 4 \

 --total-executor-cores 400 \ ##standalone default all cores

--driver-memory 1G \

--conf spark.default.parallelism=1000 \

--conf spark.storage.memoryFraction=0.5 \

--conf spark.shuffle.memoryFraction=0.3 \

繼續閱讀