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