1. NodeManager是如何Kill掉Container的呢?
答,在DefaultContainerExecutor中,
a. 使用命令行kill一個app后,ContainerLaunch中的handler中會處理兩種事件(LAUNCH_CONTAINER, CLEANUP_CONTAINER), 在CLEANUP_CONTAINER中,會調用ContainerLaunch.cleanupContainer()方法。
b. 在ContainerLaunch.cleanupContainer()方法中,首先從文件中獲取container的pid (啟動container的時候會把pid寫到臨時目錄下)。 調用ContainerExecutor.signal()方法執行
kill -0 -pid
kill -15 -pid
然后新建一個DelayedProcessKiller線程,它會調用ContainerExecutor.signal() 執行。
kill -0 -pid
kill -9 -pid
c. 為什么pid前加 "-"呢?pid前加一個 "-" 的目的是kill掉這個進程組,包括此進程與其所有子進程。
d. 執行kill的命令后會刪除相應的pid文件。
e. 為什么要每次kill命令前要 kill -0 -pid呢?
2. Yarn的RM會通過proxy把用戶的請求重定向到AppMaster上, 但從uri地址來看, 好像還是顯示RM的地址, 其在代碼上是如何實現的呢
答,在WebAppProxyServlet的doget中, 當遇到用戶請求的時候, 會執行doget,
它首先會獲取applicationReport, 從application中獲取originalTrackingUrl (一個目標url),
如果job結束(kill, finished, failed), 會重定向到originalTrackingUrl 的頁面,
其它情況,會向appmaster(originalTrackingUrl )請求相應的數據, 獲取數據后發送給客戶端。
所以關鍵在於originalTrackingUrl
3. 另外rm的代碼中包括一個web-proxy的工程. 它是做什么的呢
答,在yarn的RM中,包括web-proxy工程,它可以啟動一個單獨的進程,對外提供web服務,從resourcemanager上點擊正在執行的app,會跳轉到
yarn.web-proxy.address,這里展示正在執行的job信息,job執行結束后,會跳轉到historyserver上;如果沒有配置
yarn.web-proxy.address,則這個功能會集成到RM中。
需要配置
yarn.web-proxy.address
啟動方式為
./sbin/yarn-daemon.sh start proxyserver