天天看點

Spark源碼分析 -- TaskScheduler

spark在設計上将dagscheduler和taskscheduler完全解耦合, 是以在資源管理和task排程上可以有更多的方案

現在支援, <code>localsheduler, </code><code>clusterscheduler, </code><code>mesosscheduler, yarnclusterscheduler</code>

先分析<code>clusterscheduler</code>, 即standalone的spark叢集上, 因為比較單純不涉及其他的系統, 看看spark的任務是如何被執行的

taskscheduler接口, 注釋寫的非常清楚

對于叢集的taskscheduler實作, 相對于localscheduler 

對于submittasks, 

首先将tasksetmanager放入schedulable tree等待schedule (delay schedule, 不一定會馬上被排程到) 

然後給schedulerbackend發送reviveoffers event, 請求配置設定資源并launch tasks (launch的并一定是剛送出的tasks) 

schedulerbackend會向cluster申請workoffers(對于standalonebackend, 這步省略了), 然後再調用clusterscheduler.resourceoffers來根據可用的workoffers配置設定tasks 

最終給executors發送launchtask, 啟動tasks

resourceoffers是核心函數, 當得到可用的workeroffer後, 用于從schedulable tree中schedule合适的被執行的tasks 

resourceoffers的邏輯有點小複雜 

1. 首先依次周遊sortedtasksets, 并對于每個taskset, 周遊tasklocality 

2. 越local越優先, 找不到(launchedtask為false)才會到下個locality級别 

3. 在多次周遊offer list, 因為一次taskset.resourceoffer隻會占用一個core, 而不是一次用光所有的core, 這樣有助于一個taskset中的task比較均勻的分布在workers上 

4. 隻有在該taskset, 該locality下, 對所有worker offer都找不到合适的task時, 才跳到下個locality級别

繼續閱讀