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