1. 程式人生 > >spark中的引數設定

spark中的引數設定

之前一直在使用spark,對於spark的引數設定瞭解過部分。最近當被同事問起時,感覺自己又有點模糊。
好記性不如爛筆頭。

spark-submit的引數設定

spark的執行模式有多種,這邊就yarn提交的任務進行說明:
正常用到的引數如下:

/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 \

num-executors

設定spark任務是需要多少個executor來執行,這個可以參照任務的大小和叢集的規模來設定;想要最大化叢集資源的話,一般是和叢集的節點數保持一致,或者是叢集節點數的整數倍(還需要綜合考慮單節點的記憶體,core,能呼叫的資源的數量)

executor-memory

單個excutor的能使用的記憶體的大小,executor-memory *num-executors 就是本次任務需要的記憶體,這個值,需要參考能呼叫的資源的大小和單節點本身的記憶體的大小,在滿足這兩個前提之下,儘可能的把這個值設定的大些;

executor-cores

單個executor 執行給的core的數量,不能超過單節點的core的總和;
單個core同一時間只能執行一個task,在不影響其他人作業,且不超過節點的core的上限的時候,這個值越大執行的效率越高;

spark.default.parallelism

這個引數比較重要;
該引數設定的是stage劃分的task的數量,這個引數一定要設定。合理的設定,應該是num-executors*executor-cores 的2-3倍,每個core執行2-3個任務。要是不設定,預設的設定的task數量很少,要是不設定,之前設定的executor的數量等,就沒有起到作用,因為task很少 大部分的executor屬於空閒狀態。

spark.storage.memoryFraction

預設佔用executor 60%的記憶體 用於持久化rdd。這個值可以根據需要持久化的rdd的大小來進行設定,適當的增大\減小。參照下一個引數一起調整。

spark.shuffle.memoryFraction

當前stage 拉取上一個stage的task輸出資料能使用的記憶體的大小,預設是20%。
權衡,是shuffle操作多,還是需要cache的rdd的記憶體的訴求高,兩個記憶體的佔比和為80%

剩下的20%是使用者執行程式碼所需要的記憶體,如果發現由於頻繁的gc導致執行時間過長,可以適當的增大這個值,但是確保三個值得和是1;