五、MapReduce编程规范及事例编写
1. 编程规范
- 从开发层面来看
类1继承Mapper
类2继承reducer
主程序入口main
把上述三个类打成jar包就构成了MapReduce程序。 - 从运行层面看
MRAppMaster:程序内部的管理者,负责内部的调度协调
MapTask:就是map阶段运行的任务,所对应代码层面就是上述类1
ReduceTask:就是reduce阶段运行的任务,所对应代码层面就是上述类2
2. 示例
需求:在一堆给定的文本文件中统计输出每一个单词出现的总次数
Mapper类
package site.zhansiyu.mrtest;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* todo 该类就是mr程序map阶段调用的类 也就是maptask运行的类
*
* KEYIN:表示map阶段输入数据kv中key类型 在默认机制下 是每行的起始偏移量 long
* VALUEIN: 表示map阶段输入数据kv中value类型 在默认机制下 是每行的内容 String
*
* KEYOUT:表示map阶段输出数据kv中key类型 在本业务中输出的是单词 String
* VALUEOUT:表示map阶段输出数据kv中value类型 在本业务中输出的是单词的次数1 long
*
* mapreduce默认读取数据机制 TextInputFormat 默认读数据类 一行一行读取数据
* k:是每行起始的偏移量位置 v就是这一行的内容
*
* Long String 是java数据类型 hadoop认为其在序列化的时候 效率低
* 因此自己封装了一套数据类型 并且开发了自己的序列化机制 Writable
* long------->longWritable
* String----->Text
* int-------->IntWritable
* null------->nullWritable
*/
public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
/**
* map方法就是map阶段具体业务逻辑实现的地方
* 该方法的调用和读取数据的机制有关: 读取一行数据调用一次map方法
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 把输入的一行数据转为String
String line = value.toString();
// 按照分隔符进行切割 空格
String