Spark在Executor上的內存分配


spark.serializer (default org.apache.spark.serializer.JavaSerializer )
    建議設置為 org.apache.spark.serializer.KryoSerializer,因為KryoSerializer比JavaSerializer快,但是有可能會有些Object會序列化失敗,這個時候就需要顯示的對序列化失敗的類進行KryoSerializer的注冊,這個時候要配置spark.kryo.registrator參數

 

Spark在一個Executor中的內存分為三塊,一塊是execution內存,一塊是storage內存,一塊是other內存。

 

execution和storage是Spark Executor中內存的大戶,other占用內存相對少很多,這里就不說了。在spark-1.6.0以前的版本,execution和storage的內存分配是固定的,使用的參數配置分別是spark.shuffle.memoryFraction(execution內存占Executor總內存大小,default 0.2)和spark.storage.memoryFraction(storage內存占Executor內存大小,default 0.6),因為是1.6.0以前這兩塊內存是互相隔離的,這就導致了Executor的內存利用率不高,而且需要根據Application的具體情況,使用者自己來調節這兩個參數才能優化Spark的內存使用。在spark-1.6.0以上的版本,execution內存和storage內存可以相互借用,提高了內存的Spark中內存的使用率,同時也減少了OOM的情況。

 

spark.memory.storageFraction (default 0.5)
    這個參數設置內存表示 Executor內存中 storage/(storage+execution),雖然spark-1.6.0+的版本內存storage和execution的內存已經是可以互相借用的了,但是借用和贖回也是需要消耗性能的,所以如果明知道程序中storage是多是少就可以調節一下這個參數

execution內存是執行內存,文檔中說join,aggregate都在這部分內存中執行,shuffle的數據也會先緩存在這個內存中,滿了再寫入磁盤,能夠減少IO。其實map過程也是在這個內存中執行的。

storage內存是存儲broadcast,cache,persist數據的地方。

other內存是程序執行時預留給自己的內存。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM