Spark Task 的執行流程② - 建立、分發 Task

gamebus發表於2021-09-09

本文為 Spark 2.0 原始碼分析筆記,由於原始碼只包含 standalone 模式下完整的 executor 相關程式碼,所以本文主要針對 standalone 模式下的 executor 模組,文中內容若不特意說明均為 standalone 模式內容

建立 task(driver 端)

task 的建立本應該放在分配 tasks 給 executors一文中進行介紹,但由於建立的過程與分發及之後的反序列化執行關係緊密,我把這一部分內容挪到了本文。

建立 task 是在 TaskSetManager#resourceOffer(...) 中實現的,更準確的說是建立 TaskDescription,task 及依賴的環境都會被轉換成 byte buffer,然後與 taskId、taskName、execId 等一起構造 TaskDescription 物件,該物件將在之後被序列化並分發給 executor 去執行,主要流程如下:

圖片描述

從流程圖中可以看出,task 依賴了的檔案、jar 包、設定的屬性及其本身都會被轉換成 byte buffer

分發 task(driver 端)

分發 task 操作是在 driver 端的 CoarseGrainedSchedulerBackend#launchTasks(tasks: Seq[Seq[TaskDescription]]) 中進行,由於上一步已經建立了 TaskDescription 物件,分發這裡要做的事就很簡單,如下:

圖片描述

僅僅是序列化了 TaskDescription 物件併傳送 LaunchTask 訊息給 CoarseGrainedExecutorBackend

worker 接收並處理 LaunchTask 訊息

LaunchTask 訊息是由 CoarseGrainedExecutorBackend 接收到的,接收到後的處理流程如下:

圖片描述

接收到訊息後,CoarseGrainedExecutorBackend 會從訊息中反序列化出 TaskDescription 物件並交給 Executor 去執行;Executor 利用 TaskDescription 物件建立 TaskRunner 然後提交到自帶的執行緒池中執行。

關於 TaskRunner、執行緒池以及 task 具體是如何執行的,將會在下一篇文章中詳述,本文只關注建立、分發 task 的過程。



作者:牛肉圓粉不加蔥
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2818575/,如需轉載,請註明出處,否則將追究法律責任。

相關文章