Spark on Mesos: 粗粒度與細粒度實現分析
背景
順著昨天spark standalone實現那篇文章繼續扯淡,看看Mesos Scheduler的兩種實現的異同。
對我來說,回過頭再仔細看Spark在這一層的實現,思路又清晰了許多。
Mesos粗粒度
CoarseMesosSchedulerBackend,是mesos的粗粒度scheduler backend實現。
簡單說一下mesos的Scheduler,提供的回調函數,及spark實現的邏輯:
Mesos Scheduler接口 | 觸發場景 | spark實現邏輯 | </tr>|||||||||||||||||||||||||
void registered( SchedulerDriver driver, FrameworkID frameworkId, MasterInfo masterInfo); |
當Scheduler成向mesos master注冊之后回調, 會返回唯一的framework id |
得到framework的id,作為appId | </tr>|||||||||||||||||||||||||
void reregistered( SchedulerDriver driver, MasterInfo masterInfo) |
是mesos換了個新選舉出來的master的時候觸發, 前提是該scheduler之前已經注冊過了 |
沒有實現。 | </tr>|||||||||||||||||||||||||
void resourceOffers( SchedulerDriver driver, List<Offer> offers) |
mesos提供了一批可用的資源,讓scheduler可以使用或拒絕這些資源。 每個Offer是以slave為單位的,即以slave為單位的資源列表。 |
得到mesos的Offers列表,只要已經啟動的executor還不足夠, 那么從資源列表里繼續獲取資源,啟動CoarseGrainedExecutorBackend。 |
</tr>
|||||||||||||||||||||||||
void offerRescinded( SchedulerDriver driver, OfferID offerId) |
當請求的offer不可用時回調(可能是slave lost了之類的原因導致的), 如果在這上面繼續起task的話會報Task Lost的狀態。 |
沒有實現。spark在task scheduler層面對lost的task有自己的處理,。 | </tr>|||||||||||||||||||||||||
void statusUpdate( SchedulerDriver driver, TaskStatus status) |
task狀態更新回調,可能是finish了,可能是lost了,可能是fail了等等 | 得到finished、failed、lost等task狀態,更新內存里維護的task狀態, 并觸發新一輪的reviveOffers,即通過task scheduler繼續把resource分配給需要的task并執行它們。 |
</tr>
|||||||||||||||||||||||||
void frameworkMessage( SchedulerDriver driver, ExecutorID executorId, SlaveID slaveId, byte[] data) |
用于接收executor主動發的消息 | 沒有實現。mesos雖然在內部提供了這種msg接口,貌似不是很穩定。 使用方可以使用自己的RPC來做executor與scheduler的通信,如果真的需要的話。 |
</tr>
|||||||||||||||||||||||||
void disconnected( SchedulerDriver driver) |
當scheduler與master斷開的時候觸發, 原因可能是master掛了,或者master換了等等。 |
沒有實現。spark前面就沒有實現master新選舉的接口。 | </tr>|||||||||||||||||||||||||
void slaveLost( SchedulerDriver driver, SlaveID slaveId) |
通知某個slave lost了,以便framework進行任務的rescheduler或其他邏輯 | spark把slave lost和executor lost一起處理了。 處理邏輯就是執行RemoveExecutor操作,最終調用TaskScheduler的executorLost方法,把executor的狀態移除, 并且會繼續向上調用DAGScheduler的handleExecutorLost方法。 因executor lost可能會影響到shuffle數據,這部分還需要BlockManager感知。 |
</tr>
|||||||||||||||||||||||||
void executorLost( SchedulerDriver driver, ExecutorID executorId, SlaveID slaveId, int status) |
通知某個slave上的executor掛了。 | 同上 | </tr>|||||||||||||||||||||||||
void error( SchedulerDriver driver, String message) |
scheduler或scheduler driver發送錯誤觸發 | 沒有實現 | </tr> </tbody> </table>