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級别