在升级到MR2(YARN)之前,我将获得对RunningJob
的引用并调用 #killJob
以强制关闭MapReduce作业。
升级到YARN后,我看到YarnClient
提供了 #killApplication
方法。
我应该麻烦从前者切换到后者吗?有什么好处吗?
最佳答案
当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;
具体来说,调用流程将委托(delegate)到
ResourceMgrDelegate#killApplication
中。@Override
public void killApplication(ApplicationId applicationId)
throws YarnException, IOException {
client.killApplication(applicationId);
}
因此,我们可以得出结论,在您的用例中,调用
RunningJob#killJob
或调用YarnClient#killApplication
实际上是相同的。两种方法都将流入YarnClient
的相同代码路径中,并最终调用RPC到ResourceManager以请求终止YARN应用程序。除非您想要能够停止任何任意YARN应用程序(而不仅仅是MapReduce)的代码,否则没有令人信服的理由来更改您的代码。