Executors
Spark executor internals:
每個執行器都有一個executor JVM, 存儲RDD分區, 緩存RDD分區,運行內部線程。
如果內核數量超過了任務所需的數量,那么JVM中也會有空閑的內核。
Executor memory management
其中最重要的優化在於動態占用機制,其規則如下:
- 設定基本的存儲內存和執行內存區域(spark.storage.storageFraction 參數),該設定確定了雙方各自擁有的空間的范圍
- 雙方的空間都不足時,則存儲到硬盤;若己方空間不足而對方空余時,可借用對方的空間;(存儲空間不足是指不足以放下一個完整的 Block)
- 執行內存的空間被對方占用后,可讓對方將占用的部分轉存到硬盤,然后"歸還"借用的空間
- 存儲內存的空間被對方占用后,無法讓對方"歸還",因為需要考慮 Shuffle 過程中的很多因素,實現起來較為復雜[4]