天天看點

Yarn中ResourceManager相關三大RPC協定

        ResourceManager是Hadoop資料總管Yarn的Master,負責資源的統一管理和排程。它與Yarn中另外三個元件協同工作,共同完成應用程式在Yarn上的資源管理與排程。通過以下這張圖我們就可以看出ResourceManager在資源管理和排程中的地位和作用(ps:圖檔截取自董西成的《Hadoop技術内幕:深入解析YARN架構設計與實作原理》一書)。

Yarn中ResourceManager相關三大RPC協定

        不難看出,ResourceManager居于整體體系的正中,這也印證了它是Hadoop Yarn中Master節點。它通過不同的RPC協定與NodeManager、ApplicationMaster、Application Client一起協同工作,首先由Application Client向ResourceManager送出應用程式,并産生ApplicationMaster,然後ApplicationMaster申請向RM注冊并申請資源,而RM對資源清理能夠了如指掌并能夠适當配置設定,則是由于NodeManager向ResourceManager注冊并周期性彙報資源情況,這三大元件在RM的統一排程和管理下,共同完成應用程式在Yarn上的資源管理與排程。箭頭中間的三個RPC協定,就是本文我将要論述的重點。

        一、ResourceTracker

        這是ResourceManager與NodeManager通信使用的RPC協定。基于ResourceTracker,NodeManager可完成向ResourceManager注冊、周期性心跳彙報工作,并在周期性心跳彙報中領取RM下達的指令,比如重新初始化、清理 Container等。在這個過程中,NM扮演的是RPC client的角色,而RM扮演的是RPC server的角色,而這一過程是pull模型,即總是由slave節點NM主動發起,向RM注冊或周期性彙報。

        ResourceTracker就提供了兩個方法,如下:

        其中,registerNodeManager()實作了NM向RM注冊的過程,而nodeHeartbeat()則實作了NM向RM周期性心跳彙報的過程。

        作為RPC server端,RM中實作這個RPC功能的元件是ResourceTrackerService,在RM内部有成員變量如下定義:

        而ResourceTrackerService中也對應實作了ResourceTracker這一RPC接口的兩個方法,如下:

        至于其具體實作,我以後再分析。

        二、ApplicationMasterProtocol

        這是ResourceManager與ApplicationMaster通信使用的RPC協定。ApplicationMaster通過它完成向RM注冊、申請資源和釋放資源的過程。在這個過程中,AM扮演的是RPC client的角色,而RM扮演的是RPC server的角色,而這一過程也是pull模型,即總是由AM主動發起,RM被動接受的。

        ApplicationMasterProtocol提供了三個方法,如下:

        其中,registerApplicationMaster()實作的是AM向RM注冊這一過程,allocate()實作的則是AM向RM發起的資源申請,最後finishApplicationMaster()則完成了應用程式的關閉與資源釋放。

        同樣,作為RPC server端,RM中實作這個RPC功能的元件是ApplicationMasterService,在RM内部有成員變量如下定義:

        ApplicationMasterService中也實作了ApplicationMasterProtocol這一RPC接口的三個核心方法,如下:

        具體過程以後分析。

        三、ApplicationClientProtocol

        這是ResourceManager與Application Client通信使用的RPC協定。Application Client通過它完成向RM送出應用程式、檢視應用程式狀态、控制應用程式(殺死)等的過程。在這個過程中,Application Client扮演的是RPC client的角色,而RM扮演的是RPC server的角色。

        ApplicationClientProtocol提供了十四個方法,其中比較常見的有如下:

        其中,submitApplication()實作的是Application Client向RM送出應用程式這一過程,forceKillApplication()實作的則是Application Client向RM發起的強制殺死應用程式,moveApplicationAcrossQueues()則完成了Application Client請求RM将應用程式從一個隊列移動到另外一個隊列的過程,getClusterMetrics()則實作了Application Client向RM請求擷取叢集整體情況的過程,最後getClusterNodes()、getQueueInfo()則相應實作了AC請求RM擷取叢集節點情況、隊列情況的過程。        作為RPC server端,RM中實作這個RPC功能的元件是ClientRMService,在RM内部有成員變量如下定義:

        ClientRMService中也實作了ApplicationClientProtocol這一RPC接口的方法,如下:

        同樣,具體實作以後再做詳細分析。

繼續閱讀