Spark Task 的執行流程④ - task 結果的處理
本文為 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.maxSize
與spark.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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spark Task 的執行流程② - 建立、分發 TaskSpark
- spark 原始碼分析之二十一 -- Task的執行流程Spark原始碼
- celery筆記九之task執行結果檢視筆記
- Apache DolphinScheduler將上游Task執行結果傳遞給下游Apache
- 走進Task(2):Task 的回撥執行與 awaitAI
- Flink - Task 任務排程執行流程
- 執行緒 執行緒池 Task執行緒
- vscode中執行gulp的taskVSCode
- 【Spark】 Spark作業執行原理--獲取執行結果Spark
- 多執行緒系列(四):Task執行緒
- Task.Run(), Task.Factory.StartNew() 和 New Task() 的行為不一致分析
- Event loop的macro task和micro taskOOPMac
- Django執行方式及處理流程總結Django
- Spark Job-Stage-Task例項理解Spark
- Camunda User Task:Task Listeners
- celery筆記三之task和task的呼叫筆記
- 【Flutter 專題】95 圖解 Dart 單執行緒實現非同步處理之 Task QueueFlutter圖解Dart執行緒非同步
- 執行緒(一)——執行緒,執行緒池,Task概念+程式碼實踐執行緒
- spark task與stage數量過多調優Spark
- 多執行緒07:async、future、packaged_task、promise執行緒PackagePromise
- Task+ConcurrentQueue多執行緒程式設計執行緒程式設計
- 《深入理解Spark》之Spark的整體執行流程Spark
- Spark 叢集執行任務失敗的故障處理Spark
- 【Oracle】-【TWO_TASK】-TWO_TASK環境變數的作用Oracle變數
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- spark 原始碼分析之二十二-- Task的記憶體管理Spark原始碼記憶體
- task 7
- Gradle系列(二) Gradle執行順序和taskGradle
- Spring Task 定時任務 - 多執行緒配置Spring執行緒
- 執行結果
- .NET - Task.Run vs Task.Factory.StartNew
- 深入理解Spark 2.1 Core (四):運算結果處理和容錯的原理Spark
- WBS和TASK的區別?
- Activity 的 Task 以及 launchMode 研究
- Task三個列子的分享
- Spring Boot整合Spring Cloud Task實現批處理操作Spring BootCloud
- Task.Run(async () =>{}) 和 Task.Run(() =>{})區別
- C#執行緒篇---Task(任務)和執行緒池不得不說的祕密C#執行緒