Hadoop 在MapReduce中,如何在处理X记录后停止reducer

Hadoop 在MapReduce中,如何在处理X记录后停止reducer,hadoop,mapreduce,mapper,reducers,Hadoop,Mapreduce,Mapper,Reducers,我使用Mapper加载大量数据,这些数据具有执行时间和与其关联的大量查询。。我只需要找到1000个最昂贵的查询,因此我将执行时间作为映射器输出的键。我使用1个reducer,只希望写入1000条记录,并且reducer停止处理 我可以拥有一个全局计数器并执行此操作 如果(计数

我使用Mapper加载大量数据,这些数据具有执行时间和与其关联的大量查询。。我只需要找到1000个最昂贵的查询,因此我将执行时间作为映射器输出的键。我使用1个reducer,只希望写入1000条记录,并且reducer停止处理

我可以拥有一个全局计数器并执行此操作 如果(计数<1000){ context.write(键、值) }

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

我要减速器在吐出1000条记录后停止。通过避免下一组记录的寻道时间和读取时间,可以实现这一点


这是可能的吗?

您可以通过覆盖
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);
}
公共void运行(上下文上下文)抛出IOException、InterruptedException{
设置(上下文);
整数计数=0;
while(context.nextKey()&&count++<1000){
reduce(context.getCurrentKey(),context.getValues(),context);
}
清理(上下文);
}
这并不意味着它不一定会输出最顶层的记录,只输出前1000条键控记录(如果reduce实现输出的记录多于一条记录,那么它将不起作用——在这种情况下,您可以在reduce方法中增加计数器)