Combiner合并案例
- 需求
- 1. 需求说明
- 2. 文件
- 案例分析
- 1. 需求分析
- 2. 输入数据
- 3. 期望输出数据
- 4. 实施方案
- (1)方案一
- (2)方案二
- 代码实现
- 1. 基于wordcount案例
- 2. 方案一
- 3. 方案二
- 结果截图
需求
1. 需求说明
统计过程中对每一个MapTask的输出进行局部汇总,以减小网络传输量。
2. 文件
案例分析
1. 需求分析
可以采用Combiner功能来对每个MapTask的输出进行局部汇总,从而达到减小网络传输量。
2. 输入数据
3. 期望输出数据
Combine输入数据多,输出时经过合并,输出数据降低(观察输出控制台可以看出来)
4. 实施方案
(1)方案一
- 增加一个WordcountCombiner类继承Reducer
- 在WordcountCombiner中统计单词汇总,并将统计结果输出。
(2)方案二
- 将WordcountCombiner作为Combiner在WordcontDriver驱动类中指定
job.setCombinerClass(WordcountReducer.class);
代码实现
1. 基于wordcount案例
wordcount案例代码
2. 方案一
1)增加一个WordcountCombiner类继承Reducer
package com.atguigu.mr.wordcount;import java.io.IOException;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> {IntWritable v = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {//累加求和int sum = 0;for (IntWritable value : values) {sum += value.get();}v.set(sum);//写出context.write(key, v);}
}
2)在WordcountDriver驱动类中指定Combiner
// 指定需要使用combiner,以及用哪个类作为combiner的逻辑
job.setCombinerClass(WordcountCombiner.class);
3. 方案二
将WordcountReducer作为Combiner在WordcountDriver驱动类中指定
// 指定需要使用Combiner,以及用哪个类作为Combiner的逻辑
job.setCombinerClass(WordcountReducer.class);
结果截图