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

2. TaskSetManager

TaskSetManager任務集管理器,負責管理爲stage生成的任務集,是任務調度中比較重要的一個部分,包括如何查找任務,對TaskSchedulerImpl的任務分配做出迴應,它有幾個重要的變量:

pendingTasksForExecutor---在一個executor上執行的任務,用HashMap存儲,key值爲executor的id,value爲一個列表,列表中存儲的是該executor上運行的任務的id;

pendingTasksForHost---在主機上執行的任務,用HashMap存儲,key值爲主機,value爲一個列表,列表中存儲的是該主機上運行的任務的id;

pendingTasksForRack---在同一機架上執行的任務,用HashMap存儲,key值爲機架,value爲一個列表,列表中存儲的是該機架上運行的任務的id;

allPendingTasks---將所有的任務的id存儲在ArrayBuffer中;

其中任務的優先位置順序爲:同一executor,同一host,同一機架,任何位置都可以。這點在接下來的方法中會有所體現

TaskSetManager有幾個重要的方法,如查找任務,處理任務返回的結果(調用DAGScheduler的相應方法實現),處理成功,失敗的任務(調用DAGScheduler的taskEnded方法,TaskSetManager本身只是做一些更新或者標記操作,最核心的還是由DAGScheduler完成):

findTask:用來查找相應任務和其優先位置

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

findTaskFromList:用來從指定的executor或者host等中返回裝載沒有失敗的相應的任務的id,若找到了,則返回並且從pendingTasksForExecutor等中刪除該任務

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

resourceOffer:我認爲這個方法就是TaskSetManager對正在分配任務的exectour所作出的迴應,分配任務給executor是由TaskSchedulerImpl實現的,一般分配任務時就會調用TaskSetManager的該方法,意思就是TaskSchedulerImpl現在正在分配任務給executor了,需要TaskSetManager返回分配給該executor的任務描述,之後TaskSetManager做出迴應,表明它已經知道了,接着做出相應動作返回任務描述,主要完成以下行爲:

首先得出在當前時間下的優先位置--->使用findTask方法找到該executor,host下或者要裝載的任務(我認爲起初應該是所有的任務都根據它的Location掛在這個pendingTasksForExecutorpendingTasksForHost等之下,然後在之後指定任務給相應的executor時,先從executorpendingTasksForExecutor取任務,再從hostpendingTasksForHost去任務等等,這也就符合了前面所說的任務的優先運行位置爲同一executor,同一host。。。。此外應該注意一個任務可以放在不同host的不同executor之下,因此不同executorpendingTasksForExecutor會有相同的任務,因此在之後TaskSchedulerImpl中的resourceOffer()方法中要先打亂WorkOffer的內容,就是爲了避免一個任務重複在某個host中的某個executor下運行)--->生成taskId,taskInfo---->更新優先位置的索引和裝載時間---->更新Pool(可以理解爲線程池)的正在運行的任務的數目,且將該任務的taskId添加到正在運行的任務集中--->調用DAGScheduler的taskStarted方法開始執行任務---->返回該任務描述(包括taskId,executor的Id等等)

PS:簡單講述下源碼中出現的index和taskId的區別,index是在pendingTasksForExecutor等列表中出現的序號,而taskId是通過調用resourceOffer方法生成的,taskId具有唯一性,和全局性,比如兩個任務,任務1和任務2,任務1存儲在pendingTasksForExecutor中,可能它的index爲2,任務2存儲在pendingTasksForHost中,可能它的index爲1

這是個人的理解,不知道正確與否,希望各位小夥伴們能提出來不同的意見。。。

未完待續。。。





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