一、概念
- Combiner是MapReduce程序中Mapper和Reduce之外的一种组件
- Combiner组件的父类就是Reducer
- Combiner和Reduce的区别主要在于运行位置
Combiner是在每一个MapTask所在的节点运行, Reduce是在接收全局所有Mapper的输出结果后执行
- Combiner的意义就是对每一个MapTask的输出进行局部汇总,以减少网络传输量
- Combiner要在不影响最终逻辑业务的情况下使用,而且,Combiner的输出kv要和Reduce的输入kv类型对应起来。
二、项目介绍
1、待处理文本
zhangsan jinghang
zhangsan jinghang
lisi wangwu
zhaoliu zhangsan
xiaoming zhaoliu
2、需求
统计每个单词出现的次数
3、代码展示
WcMapper.java
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/*
* KEYIN, :hadoop处理文本后输入到mapper中key值
* VALUEIN, hadoop处理文本后输入到mapper中value值
* KEYOUT, mapper处理文本后输入到context(reducer)中key值
* VALUEOUT:mapper处理文本后输入到context(reducer)中value值
* */
/**
* LongWritable :偏移量,Text:文本内容,Text:输出到reduce的键(单词字符串),
* IntWritable:输出到reduce端的值(每个单词出现的次数)
*/
public class WcMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
private Text keyout = new Text(); // 创建text对象,存储单词
private IntWritable valueout = new IntWritable(1); // 出现次数
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//获取文本中的每一行内容
String line = value.toString();
// 分割
String[