在升级到MR2(YARN)之前,我将获得对RunningJob
的引用并调用#killJob
以强制关闭MapReduce作业。
升级到YARN后,我发现YarnClient
提供了#killApplication
方法。
我是否应该费心从前者转为后者?有什么好处吗?
答案 0 :(得分:1)
当MapReduce在YARN模式下运行时,MapReduce客户端的方法会通过名为YARNRunner
的包装类。作业终止请求通过YARNRunner#killApplication
执行。
private void killApplication(ApplicationId appId) throws IOException {
try {
resMgrDelegate.killApplication(appId);
} catch (YarnException e) {
throw new IOException(e);
}
}
这是一个名为ResourceMgrDelegate
的课程。该类在内部维护YarnClient
的实例。
protected YarnClient client;
具体来说,呼叫流程委托给ResourceMgrDelegate#killApplication
。
@Override
public void killApplication(ApplicationId applicationId)
throws YarnException, IOException {
client.killApplication(applicationId);
}
因此,我们可以得出结论,在您的用例中,调用RunningJob#killJob
或调用YarnClient#killApplication
实际上是相同的。这两种方法都会流入YarnClient
的相同代码路径,并最终调用RPC到ResourceManager来请求终止YARN应用程序。没有令人信服的理由改变你的代码,除非你想要能够阻止任何YARN应用程序(不仅仅是MapReduce)的代码。