上一篇文章對 ResourceManager 整體架構和功能進行了講述,本篇將對 RM 中管理 Application Master 的部分進行深入的講解,
下面將會介紹 RM 與 AM 整體通信執行流程,并對 RM 中涉及的對應服務進行具體講解,
為了更好的學習本篇知識,建議先熟悉以下知識點,不了解的部分可翻到前面對應的文章進行學習:
- RPC(2-2 Yarn 基礎庫 - 底層通信庫 RPC)
- 事件處理器(2-3 Yarn 基礎庫 - 服務庫與事件庫)
- AM 程式執行流程(3-3 Yarn Application Master 撰寫)
一、AM 執行流程
客戶端提交任務到 RM 后,啟動 AM 到任務完成的流程如下所示:

各個步驟具體執行操作請對應下面各服務講解,
二、AM 管理主要組成
ApplictionMaster 管理部分主要由三個服務構成,它們共同管理應用程式的 AM 的生存周期,
(以下服務均能根據名稱找到原始碼中對應的類,可以看其具體的實作邏輯)
一)ApplicationMasterLauncher
- 「服務&事件處理器」處理 AM 的 LAUNCH 和 CLEANUP 事件
- 從原始碼中可以看到:EventHandler 的
handle方法收到 AM 事件后創建 Runnable 物件,之后會放到masterEvents阻塞佇列中,launcherHandlingThread不斷從佇列中取出事件,提交到執行緒池launcherPool中處理,(流程圖如下所示)

二)AMLivelinessMonitor
- 檢查服務活性(是否有心跳)
- 繼承自抽象類
AbstractLivelinessMonitor,在抽象類中已經實作好 live 檢查邏輯,在一段時間內未匯報心跳資訊,則任務其掛了,AMLivelinessMonitor只需定義當 AM 被認為掛了(expire)時,需要處理的邏輯, - 當失敗時會發一個
RMAppAttemptEventEXPIRE 事件,
抽象類 AbstractLivelinessMonitor 簡要介紹:
public abstract class AbstractLivelinessMonitor<O> extends AbstractService {
// 里面最重要的檢查函式
// 定期遍歷記錄的 list,看是否有超時的
// 檢查周期默認為超時時間的 1/3
private class PingChecker implements Runnable {
@Override
public void run() {
while (!stopped && !Thread.currentThread().isInterrupted()) {
synchronized (AbstractLivelinessMonitor.this) {
Iterator<Map.Entry<O, Long>> iterator =
running.entrySet().iterator();
//avoid calculating current time everytime in loop
long currentTime = clock.getTime();
while (iterator.hasNext()) {
Map.Entry<O, Long> entry = iterator.next();
if (currentTime > entry.getValue() + expireInterval) {
iterator.remove();
expire(entry.getKey());
LOG.info("Expired:" + entry.getKey().toString() +
" Timed out after " + expireInterval/1000 + " secs");
}
}
}
try {
Thread.sleep(monitorInterval);
} catch (InterruptedException e) {
LOG.info(getName() + " thread interrupted");
break;
}
}
}
}
三)ApplicationMasterService
- 是 RM RPC 服務端
ApplicationMasterProtocol的實作類, - 接收處理來自 AM 的請求:主要包括注冊、心跳、清理三類,
- 心跳通過
ApplicationMasterProtocol#allocate方法定期呼叫實作,主要作用:- 請求資源
- 獲取新分配的資源
- 定期告訴 RM 其還活著(心跳)
三、小結
本篇主要介紹了 RM 中對 AM 的管理部分,首先介紹了 RM 相關組件與 AM 互動流程,之后對各服務執行邏輯、RPC 呼叫等進行了詳細的介紹,本篇中僅對 ApplicationMasterLauncher 組件進行了詳細講解,并繪圖說明,其余部分各位同學感興趣可自行梳理,
在學習這部分知識時,建議對照原始碼進行梳理,可以更好的了解其中的流程,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540609.html
標籤:其他
上一篇:01.Java面試都問啥?
下一篇:Lambda運算式
