1. 程式人生 > >【Spark調優】內存模型與參數調優

【Spark調優】內存模型與參數調優

size 由於 storage 用戶代碼 合並 cache 相互 broadcast ica

【Spark內存模型】

Spark在一個executor中的內存分為3塊:storage內存、execution內存、other內存。

  1. storage內存:存儲broadcast,cache,persist數據的地方。

  2. execution內存:執行內存,join、aggregate、map等shuffle中間結果都緩存在這部分內存中,滿了再寫入磁盤,能夠減少IO。其實map過程也是在這個內存中執行的。

  3. other內存:程序代碼執行時預留給自己的內存。

  其中,execution和storage是Spark的Executor中內存的占用大戶,other占用內存相對少很多。

【spark1.6.0之前版本】

  spark1.6.0之前版本,execution和storage的內存分配是獨立配置的,使用的參數配置分別是:

spark.storage.memoryFraction:storage內存占Executor總內存比例,default 0.6。

spark.shuffle.memoryFraction:execution內存占Executor總內存比例,default 0.2。

  spark1.6.0之前版本,上述兩塊內存是互相隔離的,無法空閑借用。這就導致了Executor的內存利用率不高,而且需要根據Application的具體情況,使用者自己來調節這兩個參數優化Spark的內存使用。

【spark1.6.0及之後版本】

  spark1.6.0及之後版本,execution內存和storage內存支持合並配置,使用的參數配置分別是:

spark.memory.fraction“execution內存+storage內存” 占Executor總內存比例,default 0.75。

spark.memory.storageFraction:storage內存 默認 占Executor總內存比例,default 0.5,如果運行時不夠用,且execution內存有空閑,可以借用execution內存。

execution內存和storage內存可以相互借用,提高了內存的Spark中內存的使用率,同時也減少了OOM的情況。

【其他】

1.spark.memory.useLegacyMode:默認值是false,也就是使用上述spark1.6.0及之後版本新的內存管理模型,推薦使用。如果非要想用老的spark1.6.0之前版本老的內存管理模型,配置為true。

2.如果發現task由於頻繁的gc導致運行緩慢(通過spark web ui可以觀察到作業的gc耗時),意味著task執行用戶代碼的內存,也就是上述other內存不夠用,嘗試調低execution和storage內存看看。

【Spark調優】內存模型與參數調優