(七)Spark源碼理解之TaskScheduler----part3

3.TaskSchedulerImpl

具體實現TaskScheduler,是TaskScheduler的子類,也是整個任務實現過程的核心,在對這部分講述之前介紹幾個比較重要的變量:

taskIdToTaskSetId:HashMap容器,key值爲task的Id,value值爲TaskSet的Id;

taskIdToExecutorId:HashMap容器,key值爲task的Id,value值爲executor的Id;

activeExecutorIds:HashSet容器,內容爲executor的Id,存儲有效的executor

executorsByHost:HashMap容器,key值爲host,value值爲HashSet,HashSet的內容爲該host下的executor的Id

executorIdToHostHashMap容器,key值爲executor的Id,value值爲executor所在的host;

它有幾個比較重要的方法來實現它的功能:

initialize():創建SchedulerBackend,以及Pool類,實質上我覺得就是爲了創建TaskSetManager;

start():調用SchedulerBackend的start方法,啓動SchedulerBackend

此外還有取消任務集,任務集完成,更新任務狀態等方法,總的來說就是從相應的容器中刪除該任務集的記錄,然後輸出相應的提示消息

submitTasks():提交任務集,異步執行,首先生成任務集管理器--->將任務集管理器存儲在名爲激活任務集的HashMap容器中--->將任務集管理器添加到SchedulableBuilder中,實質就是添加到線程池中---->若調度器沒有再接收任務且任務被裝載了(若內存太大或太小,從節點未註冊等裝載會失敗),則調用TimerTask重寫的run()方法,其實這個我總覺的沒什麼很大的意義,只是給出裝載任務未成功時的提示,實際上就是調用的是Timer的sched()方法,接着更新接收任務的標誌--->調用SchedulerBackend的reviveOffers()方法,這個纔是最主要的

<script src="https://code.csdn.net/snippets/645753.js"></script>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章