【问题标题】:Stopping MapReduce jobs, RunningJob#killJob vs YarnClient#killApplication停止 MapReduce 作业,RunningJob#killJob 与 YarnClient#killApplication
【发布时间】:2017-07-19 12:54:31
【问题描述】:

在升级到 MR2 (YARN) 之前,我将获得对 RunningJob 的引用并调用 #killJob 以强制关闭 MapReduce 作业。

升级到YARN后,看到YarnClient提供了#killApplication方法。

我应该费心从前者切换到后者吗?有什么好处吗?

【问题讨论】:

  • 我假设后者停止了应用程序主程序以及所有相关的映射器和减速器
  • 这是真的,但前者也是如此。
  • 顺便说一句,killJob 并没有消失。 hadoop.apache.org/docs/r2.7.2/api/org/apache/hadoop/mapreduce/…
  • 当然,它仍然存在。我还在用它。不过,我看到较新的 API 提供了自己的方法来做同样的事情,并想知道切换是否有益。
  • 您的使用量取决于您当时拥有的数据。你有 Job 对象,还是 applicationId?

标签: hadoop mapreduce hadoop-yarn


【解决方案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)的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多