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記憶體是程式執行時預留給自己的記憶體。
