天天看點

Spark 的 Failover 機制全解析 (Master/Worker/Executor)

背景回複【加群】,申請加入資料學習交流群

Spark 的 Failover 機制全解析 (Master/Worker/Executor)

所謂容錯是指一個系統的部分出現錯誤的情況還能夠持續地提供服務,不會因為一些細微的錯誤導緻系統性能嚴重下降或者出現系統癱瘓。在一個叢集出現機器故障、網絡問題等是常 态,尤其叢集達到較大規模後,很可能較頻繁出現機器故障不能進行提供服務,是以對于分布式叢集需要進行容錯設計。Spark在設計之初考慮到這種情況,是以它能夠實作高容錯,以下将從ExecutorWorker和Master的異常處理來介紹。

Executor 異常

Spark支援多種運作模式,這些運作模式中的叢集管理器會為任務配置設定運作資源,在運作資源中啟動Executor,由Executor是負責執行任務的運作,最終把任務運作狀态發送給Driver。 

下面将以獨立運作模式分析Executor出現異常的情況,其運作結構如圖所示,其中虛線為正常運作中進行消息通信線路,實線為異常處理步驟。

Spark 的 Failover 機制全解析 (Master/Worker/Executor)

1. 首先看 Executor 的啟動過程:在叢集中由 Master 給應用程式配置設定運作資源後,然後在 Worker中啟動 ExecutorRunner ,而 ExecutorRunner 根據目前的運作模式啟動 CoarseGrainedExecutorBackend 程序,當該程序會向Driver發送注冊Executor資訊,如果注冊成功,則 CoarseGrainedExecutorBackend 在其内部啟動 Executor。Executor 由 ExecutorRunner 進行管理,當Executor出現異常時(如所運作容器 CoarseGrainedExecutorBackend 程序異常退出等), 由 ExecutorRunner 捕獲該異常并發送 ExecutorStateChanged 消息給 Worker。

2. Worker 接收到 ExecutorStateChanged 消息時,在 Worker 的 handleExecutorStateChanged 方法中,根據Executor狀态進行資訊更新,同時把Executor狀态資訊轉發給Master。

3. Master接收到Executor狀态變化消息後,如果發現Executor出現異常退出,則調用 Master.schedule 方法,嘗試擷取可用的 Worker 節點并啟動 Executor,而這個 Worker 很可能不是失敗之前運作Executor的Worker節點。該嘗試系統會進行10次,如果超過10次,則标記該應用運作失敗并移除叢集中移除該應用。這種限定失敗次數是為了避免送出的應用程式存在 Bug 而反複送出,進而擠占叢集寶貴的資源。

Worker 異常

Spark獨立運作模式采用的是Master/Slave的結構,其中Slave是有Worker來擔任的,在運作的時候會發送心跳給Master,讓Master知道Worker的實時狀态,另一方面Master也會檢測注冊的Worker是否逾時,因為在叢集運作過程中,可能由于機器當機或者程序被殺死等原因造成Worker程序異常退出。下面将分析Spark叢集如何處理這種情況,其處理流程如圖所示。

Spark 的 Failover 機制全解析 (Master/Worker/Executor)

1. 這裡需要了解Master是如何感覺到Worker逾時?在Master接收Worker心跳的同時,在其啟動方法onStart中啟動檢測Worker逾時的線程,其代碼如下:

checkForWorkerTimeOutTask = forwardMessageThread. scheduleAtFixedRate (new Runnable { 
override def run (): Unit = Utils.tryLogNonFatalError (
//非自身發送消息CheckForWorkerTimeOut,調用timeOutDeadWorkers方法進行檢測
self.send(CheckForWorkerTimeOut)
}
}, 0, WORKER_TIMEOUT_MS, TimeUnit.MILLISECONDS)      

2. 當Worker出現逾時時,Master調用timeOutDeadWorkers方法進行處理,在處理時根據Worker運作的是Executor和Driver分别進行處理。

  • 如果是 Executor, Master 先把該 Worker 上運作的 Executor 發送消息 ExecutorUpdated 給對應的 Driver,告知 Executor 已經丢失,同時把這些 Executor 從其應用程式運作清單中删除。另外,相關Executor的異常也需要按照前一小節進行處理。
  • 如果是Driver,則判斷是否設定重新啟動。如果需要,則調用Master.schedule方法進行排程,配置設定合适節點重新開機Driver;如果不需要重新開機,則删除該應用程式。

Master 異常

Master作為Spark獨立運作模式中的核心,如果Master出現異常,則整個叢集的運作情況和資源将無法進行管理,整個叢集将處于“群龍無首”的狀況。很幸運的是,Spark在設計時考 慮了這種情況,在叢集運作的時候,Master将啟動一個或多個Standby Master,當 Master 出現異常的時候,Standby Master 将根據一定規則确定其中一個接管 Master。

Spark 的 Failover 機制全解析 (Master/Worker/Executor)

在獨立運作模式中, Spark支援如下幾種政策,可以在配置檔案spark-env.sh配置項spark .deploy, recovery Mode進行 設定,預設為NONE。

  • ZOOKEEPER:叢集的中繼資料持久化到ZooKeeper中,當Master出現異常時.ZooKeeper 會通過選舉機制選舉出新的Master,新的Master接管時需要從ZooKeeper擷取持久化 資訊并根據這些資訊恢複叢集狀态。具體結構如圖4-13所示。
  • FILESYSTEM:叢集的中繼資料持久化到本地檔案系統中,當Master出現異常時,隻要 在該機器上重新啟動Master,啟動後新的Master擷取持久化資訊并根據這些資訊恢複 叢集狀态。
  • CUSTOM:自定義恢複方式,對StandaloneRecoveryModeFactory抽象類進行實作并把 該類配置到系統中,當Master出現異常時,會根據使用者自定義的方式進行恢複叢集狀 态。
  • NONE:不持久化叢集的中繼資料,當Master出現異常時,新啟動的Master不進行恢複 叢集狀态,而是直接接管叢集。​
參考資料(侵删):
  • Apache Spark 官方文檔 https://spark.apache.org/docs/latest
  • 圖解 Spark 核心技術與案例實戰

- END -

Spark 的 Failover 機制全解析 (Master/Worker/Executor)

福利時刻

01. 背景回複「資料」,即可領取大資料經典資料。

02. 背景回複「轉型」,即可傳統資料倉庫轉型大資料必學資料。

繼續閱讀