【Spark調優】內存模型與參數調優
【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調優】內存模型與參數調優