停止 MapReduce 作业,RunningJob#killJob 与 YarnClient#killApplication
Stopping MapReduce jobs, RunningJob#killJob vs YarnClient#killApplication
在升级到 MR2 (YARN) 之前,我将获得对 RunningJob
的引用并调用 #killJob
以强制关闭 MapReduce 作业。
升级到YARN后,我看到YarnClient
提供了一个#killApplication
方法。
我应该费心从前者切换到后者吗?有什么好处吗?
当 MapReduce 在 YARN 模式下运行时,MapReduce 客户端的方法会通过一个名为 YARNRunner
的包装器 class。作业终止请求通过 YARNRunner#killApplication
.
执行
private void killApplication(ApplicationId appId) throws IOException {
try {
resMgrDelegate.killApplication(appId);
} catch (YarnException e) {
throw new IOException(e);
}
}
它进入一个名为 ResourceMgrDelegate
的 class。此 class 在内部维护 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)的代码。
在升级到 MR2 (YARN) 之前,我将获得对 RunningJob
的引用并调用 #killJob
以强制关闭 MapReduce 作业。
升级到YARN后,我看到YarnClient
提供了一个#killApplication
方法。
我应该费心从前者切换到后者吗?有什么好处吗?
当 MapReduce 在 YARN 模式下运行时,MapReduce 客户端的方法会通过一个名为 YARNRunner
的包装器 class。作业终止请求通过 YARNRunner#killApplication
.
private void killApplication(ApplicationId appId) throws IOException {
try {
resMgrDelegate.killApplication(appId);
} catch (YarnException e) {
throw new IOException(e);
}
}
它进入一个名为 ResourceMgrDelegate
的 class。此 class 在内部维护 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)的代码。