(1) Combiner 是MR程序中Mapper和Reducer之外的- -种组件。
(2) Combiner组件的父类就 是Reducer。
(3) Combiner和Reducer的区别在 于运行的位置Combiner是在每一个MapTask所在的节点运行,Reducer是接收全局所有Mapper的输出结果;
(4) Combiner的意 义就是对每一个 MapTask的输出进行局部汇总,以咸小网络传输量。
(5) Combiner能够应 用的前提是不能影响最终的业务逻辑,而且,Combiner的输出kv应该跟Reducer的输入kv类型要对应起来。
Mapper
357 ->(3+5+7)/3=5
26 ->(2+6)/2=4
Reducer
(3+5+7+2+6)/5=23/5不等于(5+4)/2=9/2
(6)自定义Combiner实现步骤
(a)自定义一个Combiner继承Reducer,重写Reduce方法
public class WordcountCombiner extends Reducer<Text, IntWritable, Text,IntWritable>{
@Override
protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
// 1 汇总操作
int count = 0;
for(IntWritable v :values){
count += v.get();
}
// 2 写出
context.write(key, new IntWritable(count));
}
}
(b)在Job驱动类中设置:
job.setCombinerClass(WordcountCombiner.class);
1.需求
统计过程中对每一个MapTask的输出进行局部汇总,以减小网络传输量即采用Combiner功能。
期望输出数据
期望:Combine输入数据多,输出时经过合并,输出数据降低。
案例实操-方案一
1)增加一个WordcountCombiner类继承Reducer
public class WordcountCombiner extends Reducer<Text, IntWritable, Text, IntWritable>{
IntWritable v = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
// 1 汇总
int sum = 0;
for(IntWritable value :values){
sum += value.get();
}
v.set(sum);
// 2 写出
context.write(key, v);
}
}
2)在WordcountDriver驱动类中指定Combiner
// 指定需要使用combiner,以及用哪个类作为combiner的逻辑
job.setCombinerClass(WordcountCombiner.class);
案例实操-方案二
1)将WordcountReducer作为Combiner在WordcountDriver驱动类中指定
// 指定需要使用Combiner,以及用哪个类作为Combiner的逻辑
job.setCombinerClass(WordcountReducer.class);