1. 程式人生 > >spark2原理分析-Task排程物件實現介面(Schedulable)原理分析

spark2原理分析-Task排程物件實現介面(Schedulable)原理分析

概述

本文分析任務排程器TaskScheduler中的排程實體的實現合約的原理。

TaskScheduler中的排程物件

在TaskScheduler中排程物件是實現了合約(即:介面)Schedulable的類的物件。

Schedulable是是可排程實體的合約,可以在這裡檢視該介面的實現程式碼
在spark2中有兩個類實現了排程實體介面:Schedulable。也就是說有兩種排程實體:

  • Pool
  • TaskSetManager

在後面的文章中會對這兩種排程實體進行詳細分析。

排程物件介面分析

通過檢視原始碼我們知道,該介面包括以下一些成員,下面分別講解這些成員變數的意義。

  • name
 def name: String

每個可排程實體都有一個名稱。

  • parent
var parent: Pool

該成員表示依賴的Pool可以排程實體,通過parent可以構建一顆樹

  • schedulableQueue
def schedulableQueue: ConcurrentLinkedQueue[Schedulable]

管理一套可排程的實體集,是一個同步佇列,所以和該佇列對應的有兩個操作函式:

 def addSchedulable(schedulable: Schedulable): Unit
 def removeSchedulable(schedulable: Schedulable): Unit

用來向佇列中新增和刪除排程物件。

  • schedulingMode
def schedulingMode: SchedulingMode

該成員變數代表排程模式,不同調度模式對應不同的排程演算法。

  • stageId
def stageId: Int

表示該排程物件對應的stage id。

  • weight,minShare,priority
  def weight: Int
  def minShare: Int
  def priority: Int

權重,時間,優先順序,這些成員在進行任務排程時,用來計算任務的優先順序。

  • getSchedulableByName
def getSchedulableByName(name: String): Schedulable

通過該函式可以根據排程實體的名稱,來查詢該物件。

  • executorLost
 def executorLost(executorId: String, host: String, reason: ExecutorLossReason): Unit

當執行任務的執行器(executor)失敗時,會呼叫該函式進行處理。TaskSchedulerImpl呼叫該函式來通知TaskSetManagers執行失敗。

  • checkSpeculatableTasks
  def checkSpeculatableTasks(minTimeToSpeculation: Int): Boolean

該函式用來檢查要推測的任務,如果有,則返回true。 由TaskScheduler定期呼叫。
但注意:不能推測我們是否只有一個任務,也不能推測任務集是否是一個殭屍任務集。

  • getSortedTaskSetQueue
  def getSortedTaskSetQueue: ArrayBuffer[TaskSetManager]

在TaskSchedulerImpl中使用該函式來處理資源的供給(讓每個TaskSetManager知道新的執行器已經準備好執行任務)。

總結

本文分析了任務排程物件的實現合約的原理,對其各個成員進行了分析和說明。接下來會繼續分析實現該合約的兩種排程實體的實現。