怎么實現(xiàn)NodeManager的原理分析,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
淇縣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
1、 和其他模塊之間的交互接口分析
1)作為client,NodeStatusUpdater通過ResourceTracker協(xié)議和RM進行交互。
該API有兩個方法
向RM注冊NodeManager,參數(shù)為httpPort、nodeId、totalResource,其中totalResource為節(jié)點的總可分配資源,包括CPU、內(nèi)存。
向RM心跳,NM啟動后通過定期的向RM匯報Container情況,比如處于launched container、已經(jīng)完成的container、節(jié)點的健康信息,并返回領(lǐng)取命令,如kill container。
2)作為服務(wù)端,提供ContainerManager服務(wù),通過ContainerManagementProtocol協(xié)議為AM提供服務(wù)。
該API提供了3個方法
啟動containers,參數(shù)為StartContainersRequest,也即是StartContainerRequest列表,每個對象是包括啟動Container所需要的資源(localResources)、環(huán)境變量(environment )、命令(commands)、Token等。
停止containers,參數(shù)為StopContainerResult,指定kill的containerId。
獲取container狀態(tài),參數(shù)為GetContainerStatusRequest,指定目標containerId。
2、 幾個主要功能類介紹
1)NodeStatusUpdater:周期性的向RM匯報container的狀態(tài),包括launched containers、finished containers,返回待clean的Container列表,待clean的Application列表等。
2)ApplicationImpl:NM的應(yīng)用的狀態(tài)機宿主對象,管理NM上的該application的所有container;維護一個狀態(tài)機,記錄app的狀態(tài)之間的遷移和事件,以及事件動作。
3)ContainerImpl:NM的Container的狀態(tài)機宿主對象,激勵container各個狀態(tài)之間的遷移和事件,以及事件的動作。
4)ContainerManager:提供了RPC服務(wù),啟動containers、停止containers、獲取container的狀態(tài)信息;這個類是container管理的啟動類。
5)LogHandler:Container的運行日志服務(wù),可以通過參數(shù)yarn.nodemanager.log-dirs配置多個日志目錄,每個目錄的結(jié)構(gòu)是相同的,$log-dir/$appid/$containerid/stderr|stdout|stdlog;有兩個實現(xiàn)類,NonAggregationLogHandler、LogAggregationService,由于NM會產(chǎn)生大量的日志,需要進行清理,NonAggregationLogHandler是定期清理日志,LogAggregationService是日志聚集轉(zhuǎn)存的方式上傳到HDFS中,默認情況下采用定期清理日志的方式。
6)ResourceLocalizationService:啟動container,需要把container需要的Resource本地化,可以根據(jù)啟動container的參數(shù)從hdfs中下載資源,并均勻分布在各磁盤上的數(shù)據(jù)目錄中。本地數(shù)據(jù)目錄,存放執(zhí)行Container所需要的數(shù)據(jù)(包括可執(zhí)行程序、jar、配置等),還有一部分是MR過程中臨時產(chǎn)生的中間數(shù)據(jù)。ResourceLocalizationService啟動一個RPC服務(wù)(LocalizationProtocol)供下載資源,對于每個container由ContainerLocalizer作為客戶端通過LocalizationProtocol協(xié)議進行資源下載,并及時heartbeat進行進度報告。
7)ContainersLauncher:維護一個線程池來運行ContainerLaunch任務(wù),該任務(wù)生成shelllaunch_container.sh腳本,并隨后通過ContainerExecutor.launchContainer啟動container進程。
8)ContainerExecutor:啟動和清除container的進程。兩種實現(xiàn)DefaultContainerExecutor、LinuxContainerExecutor,默認是DefaultContainerExecutor,而LinuxContainerExecutor以更加安全的方式通過Application的擁有者的身份啟動和停止Container,并且可以使用Cgroups對CPU資源進行隔離。
9)ContainerMonitor:周期性的探測Container的資源使用量。一旦超過限額,則kill container。內(nèi)存資源可以通過ContainerMonitor監(jiān)控,對于CPU還是利用Cgroups。
10)AuxService:隨著NM的啟動和停止運行的擴展的服務(wù)。
11)NodeHealthCheckService:周期性運行自定義腳本和寫磁盤文件檢查NM的健康,并通過NodeStatusUpdater匯報給RM,一旦不健康則RM不會分配任務(wù)給該NM,直到恢復(fù)健康。
3、 Container事件流程
1)AM或者RM通過NM的RPC service ContainerManagementProtocol.startContainers啟動container
2)NM的服務(wù)端ContainerManagerImpl的startContainers邏輯會按照請求的container 數(shù)量要求,依次啟動container;啟動container的邏輯為創(chuàng)建并初始化Application,創(chuàng)建并初始化container。
3)發(fā)送事件ApplicationEventType.INIT_APPLICATION到事件處理框架AsyncDispatcher,對于ApplicationEventType類型的事件由ApplicationEventDispatcher進行處理,在該dispatcher handle中調(diào)用狀態(tài)機stateMachine的宿主對象ApplicationImpl的handle方法,該handle方法中調(diào)用處理INIT_APPLICATION 事件(狀態(tài)由ApplicationState.NEW àApplicationState.INITING) 的邏輯AppInitTransition,在該AppInitTransition中發(fā)送LogHandlerEventType.APPLICATION_STARTED。
4)LogHandlerEventType.APPLICATION_STARTED由LogAggregationService進行處理,在這里創(chuàng)建Application相關(guān)的log目錄,后發(fā)送ApplicationEventType.APPLICATION_LOG_HANDLING_INITED到事件處理框架。
5)通過AppLogInitDoneTransition對ApplicationEventType.APPLICATION_LOG_HANDLING_INITED進行處理,其中發(fā)送LocalizationEventType.INIT_APPLICATION_RESOURCES事件,該事件由ResourceLocalizationService進行處理,其發(fā)送ApplicationEventType.APPLICATION_INITED到事件處理框架。
6)由Application中狀態(tài)機轉(zhuǎn)換邏輯AppInitDoneTransition完成對ApplicationEventType.APPLICATION_INITED事件的處理,并由ApplicationState.INITING, 狀態(tài)過度到ApplicationState.RUNNING狀態(tài);
7)在AppInitDoneTransition邏輯中依次對Application中的container,發(fā)送ContainerEventType.INIT_CONTAINER事件,阻塞對該事件的處理一直到container 處于new狀態(tài)。
8)ContainerEventType.INIT_CONTAINER事件由狀態(tài)機宿主對象ContainerImpl 中的RequestResourcesTransition邏輯進行處理,進入資源本地化處理,如果有resource需要本地化(下載或者創(chuàng)建),那么就發(fā)送INIT_CONTAINER_RESOURCES到ResourceLocalizationService進行處理,并進入到LOCALIZING狀態(tài);如果resource都已本地化(已創(chuàng)建或者下載了),那么就發(fā)送LAUNCH_CONTAINER事件,并直接進入到LOCALIZED狀態(tài)。
9)ResourceLocalizationService對INIT_CONTAINER_RESOURCES的處理邏輯是,對container的每一個請求的資源,對應(yīng)一個LocalResourcesTracker實現(xiàn),并發(fā)送ResourceEventType.REQUEST請求到該tracker中;每種類型的資源都有一個宿主對象LocalizedResource,在tracker中轉(zhuǎn)發(fā)該事件給LocalizedResource進行處理,進入狀態(tài)機的轉(zhuǎn)換(ResourceState.INIT->ResourceState.DOWNLOADING),調(diào)用邏輯處理FetchResourceTransition,該transition發(fā)送事件LocalizerEventType.REQUEST_RESOURCE_LOCALIZATION,由LocalizerTracker邏輯啟用線程LocalizerRunner prepare該container的環(huán)境(Application目錄、日志目錄..),調(diào)用ContainerExecutor.startLocalizer啟動ContainerLocalizer,并在下載Resource過程中向ResourceLocalizationService匯報進度。
10)Resource資源本地化完成后,首先發(fā)送ContainerEventType.RESOURCE_LOCALIZED到ContainerImpl,ContainerImpl隨后發(fā)送ContainersLauncherEventType.LAUNCH_CONTAINER事件由ContainersLauncher進行處理,將運行container的完整shell寫到私有目錄下的launch_container.sh中,在處理過程中單獨開啟線程ContainerLaunch,ContainerLauch生成shelllaunch_container.sh腳本,并啟動運行一個container(ContainerExecutor.launchContainer)。
11)運行container,由ContainerExecutor. launchContainer執(zhí)行shell腳本來完成;shell腳本運行YarnChild MR任務(wù)(和MR1一樣),運行container過程中一直阻塞直到container運行完成,進入Container資源清理流程
12)Container運行可能成功也可能失敗,ContainerImpl收到CONTAINER_EXITED_WITH_SUCCESS事件后,分別向ContainersLauncher和ResourceLocalizationService發(fā)送CLEANUP_CONTAINER和CLEANUP_CONTAINER_RESOURCES事件。
13)ContainersLauncher清理Container的臨時目錄,比如進程PID文件,檢查該文件是否存在,若存在則強制回收,回收完成后,ContainerLauncher發(fā)送CONTAINER_RESOURCES_CLEANDUP事件到ContainerImpl,后通過向ApplicationImpl、ContainerMonitorImpl、LogHandler發(fā)送FINISHED事件,從Container列表中移除該Container,移除對該Container的資源使用量監(jiān)控。
14) ResourceLocalizationService清理container的相關(guān)數(shù)據(jù)目錄(shell腳本等),后向ContainerImpl發(fā)送CONTAINER_RESOURCE_CLEANEDUP事件。
注意Container的部分中間數(shù)據(jù)是在整個應(yīng)用完成之后清理的,因為只有RM清楚這個Application是否已經(jīng)完成了。NM NodeStatusUpdater通過ResourceTrackerProtocol協(xié)議heartbeat匯報給RM,RM返回需要需要清理的Container列表給NM,NM才徹底清理Container占用的所有資源。
看完上述內(nèi)容,你們掌握怎么實現(xiàn)NodeManager的原理分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站題目:怎么實現(xiàn)NodeManager的原理分析
網(wǎng)址分享:http://jinyejixie.com/article34/ijjise.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站收錄、電子商務(wù)、面包屑導(dǎo)航、小程序開發(fā)、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)