MapReduce Combiner 合并
(1)Combiner是MR程序中Mapper和Reducer之外的一种组件。
(2)Combiner组件的父类就是Reducer。
(3)Combiner和Reducer的区别在于运行的位置Combiner是在每一个MapTask所在的节点运行;
(4)Combiner的意义就是对每一个MapTask的输出进行局部汇总,以减小网络传输量。
(5)Combiner能够应用的前提是不能影响最终的业务逻辑,而且,Combiner的输出kv应该跟Reducer的输入kv类型要对应起来。
a、自定义一个 Combiner 继承 Reducer,重写 Reduce 方法
b、在 Job 驱动类中设置
job.setCombinerClass
Combiner 合并案例
统计过程中对每一个 MapTask 的输出进行局部汇总,以减小网络传输量即采用‘Combiner 功能。
方案一
Combiner
package com.xiaoqiu.mapreduce.Combiner;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
* @author 小邱
* @version 0.0.1
* @description Combiner
* @since 2021/12/4 15:18
*/
public class Combiner extends Reducer<Text, IntWritable,Text, IntWritable> {
private IntWritable outV = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum =0;
for (IntWritable value : values) {
sum+=value.get();
}
outV.set(sum);
context.write(key,outV);
}
}
驱动类中指定 Combiner
job.setCombinerClass(Combiner.class);
方案二
将 WordcountReducer 作为 Combiner 在 WordcountDriver 驱动类中指定
job.setCombinerClass(CombinerReducer.class);