在MapReduce中,如何在处理X记录后停止减速器

时间:2013-06-24 22:00:06

标签: hadoop mapreduce mapper reducers

我正在使用Mapper加载大量数据,这些数据具有执行时间和与之关联的大型查询。我只需要查找1000个最昂贵的查询,因此我将执行时间作为关键字提供给我的映射器的输出。我使用1个reducer,只想写1000条记录,减速机停止处理。

我可以拥有一个全球计数器并执行此操作     if(count< 1000){         context.write(键,值)     }

但是这仍然会加载所有数十亿条记录,然后不再编写它们。

我想在吐出1000条记录后停止减速机。通过避免下一组记录的搜索时间和读取时间。

这可能吗?

1 个答案:

答案 0 :(得分:6)

您可以通过覆盖Reducer.run()方法的默认实现来完全缩短您的reducer:

public void run(Context context) throws IOException, InterruptedException {
  setup(context);
  while (context.nextKey()) {
    reduce(context.getCurrentKey(), context.getValues(), context);
  }
  cleanup(context);
}

您应该能够修改while循环以包含您的计数器,如下所示:

public void run(Context context) throws IOException, InterruptedException {
  setup(context);
  int count = 0;
  while (context.nextKey() && count++ < 1000) {
    reduce(context.getCurrentKey(), context.getValues(), context);
  }
  cleanup(context);
}

并不是说这不一定会输出最前面的记录,只会输出前1000个键控记录(如果你的reduce实现输出的数据多于单个记录,则无法工作 - 在这种情况下你可以在reduce方法中增加计数器)