为此,您最好有一个减速器。
为了确保所有数字都到达同一个减速器,你必须做两件事:
- 为映射器中的所有输入值发出相同的键
- 将减少任务设置为零。
您map()
的方法可能如下所示:
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
context.write(new Text("MyAwesomeKey"), key); // assuming that your number is being read in the key
}
在您的Reduce
班级中,有一个 property max
,例如:
Long max
该reduce()
方法可能如下所示:
@Override
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
context.write(new Text("MyAwesomeKey"), key); // assuming that your number is being read in the key
}
然后在run()
我们覆盖时也覆盖reduce()
:
public void run(Context context) throws IOException, InterruptedException {
setup(context);
while (context.nextKey()) {
reduce(context.getCurrentKey(), context.getValues(), context);
}
context.write(new LongWritable(max),new Text("")); // write the max value
cleanup(context);
}
要将reduce任务设置为一个,请在您的工作中执行以下操作run()
,请注意这与上述不同run()
:
job.setNumReduceTasks(1);
注意:以上所有代码都遵循新的mapreduce API,我相信使用旧的mapred API 在 reducer 完成工作后,我们将无法拥有单点钩子,因为我们可以通过覆盖run()
Reducer 来做到这一点。