在升级到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)的代码,否则没有令人信服的理由来更改您的代码。

10-08 15:56