YARN原始碼解析(3)-作業提交2

b10l07發表於2018-03-05

在上一篇文章中,我們初步介紹了一個客戶端是如何準備一個Job並提交給YARN.在這篇文章中,我們會簡單介紹,在YARN端,是如何提交併啟動這個Job的.

過程

首先,Client會傳送ApplicationSubmissionContext以及ContainerLaunchContext到ResourceManager.

4108852-776261a057c93d24.png
4108852-0cc6ebc5b8db6c2d.png

我們可以看到,這裡並不會使用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傳送來的資料結構,並進行一些驗證.

4108852-d7f247dd006c38db.png

然後,ResourceManager通知YarnScheduler進行資源的分配,為ApplicationMaster分配Container.

4108852-2dce5b54dfc03a63.png

然後,ResourceManager給ApplicationMasterLauncher傳送一個事件-AMLauncherEventType.LAUNCH

4108852-7135b27434217c2c.png

然後,ApplicationMasterLauncher在接收到這個事件之後,會啟動一個AMLauncher

4108852-04b894d05bacdf98.png

然後,這個AMLauncher通知NodeManager的ContainerManagerImpl啟動一個ApplicationMaster.

4108852-0989ef5fdb41c20e.png
4108852-6b8795a62660d499.png

ContainerManagerImpl在接收到AMLauncher的通知之後,就會檢查AMLauncher傳送給它的Container相關的資訊是否正確.如果驗證通過,就將需要的資源進行本地化,供Container執行的時候使用.

4108852-dcaf77c1813c20c8.png

這裡我們可以看到,總共有三種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進行容器的載入.

4108852-3b79c532f619f047.png
4108852-4d680d3b610ef628.png

從上面的程式碼中,我們可以看到,ContainerLaunch會一直阻塞,直到Container執行完成,並向ApplicationMaster或者ResourceManager報告結果.

這樣ApplicationMaster就啟動完成了.

在ApplicationMaster內部,會根據InputSplit來決定Mapper的數量,通過ResourceRequest向ResourceManager請求資源,然後在NodeManager上進行分配.

ApplicationMaster為Mapper或者Reducer分配Container的過程,跟上面給ApplicationMaster分配Container的過程,都是一樣的,這裡我們不再贅述.

而ApplicationMaster中,具體的工作流程,我們會在以後的文章中進行介紹.

總結

其實過程倒是不復雜,但是由於採用狀態機的機制,以及基於訊息轉發器的實現,而且每個元件的狀態都有好多種,所以讀起來可能有點瑣碎,需要畫好多流程圖來輔助理解.

相關文章