21

每个 mapper 和 reducer 任务中是否分别调用了 setup 和 cleanup 方法?还是在整个映射器和减速器作业开始时只调用一次?

4

5 回答 5

25

每个任务都会调用它们,因此如果您有 20 个映射器正在运行,则将为每个任务调用 setup/cleanup。

一个问题是 Mapper 和 Reducer 的标准 run 方法不会捕获 map / reduce 方法周围的异常 - 因此,如果在这些方法中抛出异常,则不会调用 clean up 方法。

2020 年编辑:如评论中所述,2012 年(Hadoop 0.20)的此声明不再正确,清理被称为 finally 块的一部分。

于 2012-06-05T01:01:29.580 回答
5

一个澄清是有帮助的。setup/cleanup 方法用于在任务级别进行初始化和清理。在一个任务中,首先通过调用 setup() 方法进行初始化,然后对 map() [或 reduce()] 函数的所有调用都将完成。之后,将在退出任务之前对 cleanup() 方法进行另一次调用。

于 2014-01-06T01:39:43.683 回答
4

它被每个 Mapper 任务或 Reducer 任务调用。这是hadoop代码。

public void run(Context context) throws IOException, InterruptedException {
    setup(context);
    try {
      while (context.nextKey()) {
        reduce(context.getCurrentKey(), context.getValues(), context);
      }
    } finally {
      cleanup(context);
    }
  }
于 2014-02-15T14:59:12.953 回答
2

根据mapreduce 文档 ,每个 Mapper 和 Reducer 任务都会调用 setup 和 cleanup。

于 2015-03-19T07:47:32.867 回答
1

在减速器上,您可以在工作中执行 job.setNumReduceTasks(1); 这样减速器的设置和清理将只运行一次。

于 2015-09-21T23:22:30.957 回答