Spark Task 的執行流程④ - task 結果的處理

choubou發表於2021-09-09

本文為 Spark 2.0 原始碼分析筆記,其他版本可能稍有不同

一文中介紹了 task 是如何執行並返回 task 執行結果的,本文將進一步介紹 task 的結果是怎麼處理的。

worker 端的處理

處理 task 的結果是在 TaskRunner#run() 中進行的,緊接著 task 執行步驟,結果處理的核心流程如下:

圖片描述

我們進一步展開上圖中淺灰色背景步驟,根據 resultSize(序列化後的 task 結果大小) 大小的不同,共有三種情況:

  • resultSize > spark.driver.maxResultSize 配置值(預設1G):直接丟棄,若有必要需要修改 spark.driver.maxResultSize 的值。此時,serializedResult 為序列化的 IndirectTaskResult 物件,driver 之後透過該物件是獲得不到結果的

  • resultSize > maxDirectResultSize 且 resultSize <= spark.driver.maxResultSize 配置值:maxDirectResultSize 為配置的 spark.rpc.message.maxSizespark.task.maxDirectResultSize 更小的值;這種情況下,會將結果儲存到 BlockManager 中。此時,serializedResult 為序列化的 IndirectTaskResult 物件,driver 之後可以透過該物件在 BlockManager 系統中拉取結果

  • resultSize <= maxDirectResultSize:serializedResult 直接就是 serializedDirectResult

在拿到 serializedResult 之後,呼叫 CoarseGrainedExecutorBackend#statusUpdate 方法,如下:

execBackend.statusUpdate(taskId, TaskState.FINISHED, serializedResult)

該方法會使用 driverRpcEndpointRef 傳送一條包含 serializedResult 的 StatusUpdate 訊息給 driver (更具體說是其中的 CoarseGrainedSchedulerBackend 物件)

driver 端的處理

driver 端的 CoarseGrainedSchedulerBackend 在收到 worker 端傳送的 StatusUpdate 訊息後,會進行一系列的處理,包括呼叫 TaskScheduler 方法以做通知,主要流程如下:

圖片描述

其中,需要說明的是 Task 的狀態只有為 FINISHED 時才成功,其他值(FAILED, KILLED, LOST)均為失敗。



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


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

相關文章