在Hadoop MapReduce中,Combiner类主要用于在map任务的本地进行数据聚合,以减少网络传输的数据量。以下是一个使用Java编写的Combiner类的例子:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordCountCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
在这个例子中,WordCountCombiner继承了Reducer类,并重写了reduce方法。它接收一个key(单词)和一个值的迭代器(该单词出现的次数),然后计算这些值的总和,并将结果写入上下文。
这个Combiner类可以与Map和Reduce类一起使用,如下所示:
public class WordCount {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
// ...
}
public static class WordCountCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {
// ...
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
// ...
}
}
在这个例子中,Combiner类被用作Reducer的一个本地版本,用于在map任务的本地进行数据聚合。