文章目录
参考资料
运行环境
- windows10
- CentOS7虚拟机
- JDK8
- Hadoop3.1.3
一、Java MapReduce 编程规范
用于编写的程序分为三个部分:Mapper、Reducer和Driver
1.1 Mapper阶段
- 用户自定义的Mapper需继承自己的父类
- Mapper的输入数据是KV对的形式(KV类型可自定义)
- Mapper中的业务逻辑卸载map() 方法中
- Maper的输出数据是KV对的形式(KV类型可自定义)
- map()方法(MapTask进程)对每一个<K,V>调用一次
1.2 Reduce阶段
- 用户自定义的Reducer要继承自己的父类
- Reducer的输入数据类型赌赢Mapper的输出数据类型,也是KV、
- Reducer的业务逻辑写在reduce()方法中
- ReduceTask进程对每一组相同k的<K, V> 组调用一次reduce()方法
1.3 Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的Job对象。
二、WordCount 案例
需求:在给定的文本文件中统计输出每一个单词出现的总次数
测试数据:
hello wolrd
hello spark
my name is uni
hadoop is nice
hadoop
预期结果:
hello 2
hadoop 2
is 2
my 1
name 1
nice 1
spark 1
uni 1
world 1
2.1 Mapper
- 将MapTask传给文本内容,先转换成String
- 根据空格将这一行切分成单词
- 将单词转化为<单词, 1> 的形式
WordCountMapper.java
package com.uni.mr.wordcount;
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, VALUEIN, KEYOUT, VALUEOUT>
* KEYIN , map 阶段输入key的类型: LongWritable
* VALUEIN, map 阶段输入value的类型: Text
* KEYOUT, map 阶段输出vkey的类型:Text
* VALUEOUT, map阶段输出的value类型:IntWritable
*/
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
// 放在上面声明防止在循环里多次创建对象,浪费空间
private Text outKey = new Text();
private IntWritable outValue = new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 1. 获取一行
String line = value.toString();
// 2. 切割
String[] words = line.split(" ");
// 3. 循环写出
for (String word : words) {
// 封装 outKey
outKey.set(word);
context.write(outKey, outValue);
}
}
}
2.2 Reducer
- 汇总各个key的个数
- 输出该key的总次数
WordCountReducer.java
package com.uni.mr.wordcount;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;