YARN原始碼解析(3)-作業提交2
在上一篇文章中,我們初步介紹了一個客戶端是如何準備一個Job並提交給YARN.在這篇文章中,我們會簡單介紹,在YARN端,是如何提交併啟動這個Job的.
過程
首先,Client會傳送ApplicationSubmissionContext以及ContainerLaunchContext到ResourceManager.
我們可以看到,這裡並不會使用rmClient.submitApplication(request)這個方法的返回結果,而是會在後面一直通過getApplicationReport(applicationId)方法返回的ApplicationReport中的YarnApplicationState來判斷Job是否提交成功.
ApplicationReport中,包含了這麼一些資訊:
- ApplicationId
- Application user
- Application queue
- Application name
- Host on which the ApplicationMaster is running
- RPC port of the ApplicationMaster
- Tracking URL
- YarnApplicationState of the application
- Diagnostic information in case of errors
- Start time of the application
- Client Token of the application(if security is enabled)
其中的Host on which the ApplicationMaster is running以及RPC port of the ApplicationMaster,就可以讓Client知道去哪裡讀取MapReduce Job的狀態資訊.
然後,ResourceManager中的ClientRMService接收到Client傳送來的資料結構,並進行一些驗證.
然後,ResourceManager通知YarnScheduler進行資源的分配,為ApplicationMaster分配Container.
然後,ResourceManager給ApplicationMasterLauncher傳送一個事件-AMLauncherEventType.LAUNCH.
然後,ApplicationMasterLauncher在接收到這個事件之後,會啟動一個AMLauncher.
然後,這個AMLauncher通知NodeManager的ContainerManagerImpl啟動一個ApplicationMaster.
ContainerManagerImpl在接收到AMLauncher的通知之後,就會檢查AMLauncher傳送給它的Container相關的資訊是否正確.如果驗證通過,就將需要的資源進行本地化,供Container執行的時候使用.
這裡我們可以看到,總共有三種visibility的LocalResource:
- PUBLIC: All the LocalResources that are marked PUBLIC are accessible for containers of any user.
- PRIVATE: LocalResources that are marked PRIVATE are shared among all applications of the same user on the node.
- APPLICATION: All the resources that are marked as having the APPLICATION scope are shared only among containers of the same application on the node.
在資源本地化完成之後,就會通過ContainersLauncher進行容器的載入.
從上面的程式碼中,我們可以看到,ContainerLaunch會一直阻塞,直到Container執行完成,並向ApplicationMaster或者ResourceManager報告結果.
這樣ApplicationMaster就啟動完成了.
在ApplicationMaster內部,會根據InputSplit來決定Mapper的數量,通過ResourceRequest向ResourceManager請求資源,然後在NodeManager上進行分配.
ApplicationMaster為Mapper或者Reducer分配Container的過程,跟上面給ApplicationMaster分配Container的過程,都是一樣的,這裡我們不再贅述.
而ApplicationMaster中,具體的工作流程,我們會在以後的文章中進行介紹.
總結
其實過程倒是不復雜,但是由於採用狀態機的機制,以及基於訊息轉發器的實現,而且每個元件的狀態都有好多種,所以讀起來可能有點瑣碎,需要畫好多流程圖來輔助理解.
相關文章
- Drill-on-YARN之原始碼解析Yarn原始碼
- Spark on Yarn 任務提交流程原始碼分析SparkYarn原始碼
- Spark原始碼解析-Yarn部署流程(ApplicationMaster)Spark原始碼YarnAPPAST
- Flink Yarn的2種任務提交方式Yarn
- YARN 核心原始碼分析Yarn原始碼
- spark核心(下)——job任務提交原始碼解析Spark原始碼
- Hadoop3.2.1 【 YARN 】原始碼分析 :RPC通訊解析HadoopYarn原始碼RPC
- koa2原始碼解析原始碼
- Retrofit2原始碼解析原始碼
- 測試作業提交
- 【原始碼SOLO】Retrofit2原始碼解析(一)原始碼
- 【原始碼SOLO】Retrofit2原始碼解析(二)原始碼
- [原始碼解析]Oozie來龍去脈之提交任務原始碼
- Spark 原始碼解析 : DAGScheduler中的DAG劃分與提交Spark原始碼
- React Hooks 原始碼解析(3):useStateReactHook原始碼
- ChatGLM3 原始碼解析(五)原始碼
- Hadoop2原始碼分析-YARN RPC 示例介紹Hadoop原始碼YarnRPC
- RxJava2 原始碼解析(一)RxJava原始碼
- Retrofit2原始碼解析(一)原始碼
- Promise-Polyfill原始碼解析(2)Promise原始碼
- RxJava2 原始碼解析(二)RxJava原始碼
- underscore.js原始碼解析2JS原始碼
- ptmalloc2原始碼解析初探原始碼
- mina2原始碼解析原始碼
- yarn-per-job提交流程Yarn
- 解析ORB-SLAM3的原始碼ORBSLAM原始碼
- myBatis原始碼解析-快取篇(2)MyBatis原始碼快取
- Netty原始碼解析2-ReactorNetty原始碼React
- 深入RxJava2 原始碼解析(一)RxJava原始碼
- Mybatis原始碼解析2—— 例項搭建MyBatis原始碼
- 深入RxJava2 原始碼解析(二)RxJava原始碼
- RxDownload2 原始碼解析(三)原始碼
- RxDownload2 原始碼解析(二)原始碼
- AFNetworking原始碼解析系列(2)原始碼
- gulp原始碼解析(2):vinyl-fs原始碼
- Struts2 原始碼分析-----攔截器原始碼解析 --- ParametersInterceptor原始碼
- 友好 RxJava2.x 原始碼解析(三)zip 原始碼分析RxJava原始碼
- 原始碼解析:Git的第一個提交是什麼樣的?原始碼Git