停止 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)的代码。