1、概述
MapReduce程序主要可分为三部分,即:mapper、reducer、driver(即main函数提交作业部分),根据需求不同可以设置partitioner、combinner以及cleanup部分。后三部分作用分别描述如下:
mapper:实现从输入文件中以(key,value)的形式获取想要提取的数据;
reducer:实现将mapper的输出结果汇总、归并;
driver:负责作业设置、作业提交;
partitioner:实现将Map阶段的输出结果按指定的方法分到不同的分区中,为reduce阶段做准备。若没有自定义分区方法,则会启动默认的partitioner,它根据ReduceTask的数量将Map的结果进行分区;
combinner:在进入reduce之前对map的输出结果进行组合,例如:在执行Word Count程序时,map端输出结果有100万个(hello,1)的key/value对;若将其直接传到reduce端,需要传输100万次,当这个reduce在另一台服务器时需要消耗大量的网络带宽资源,运行效率不高;但是,若将这100万个(hello,1)组合成(hello,1000000)传到reduce端,则只需要传递1次,可以大大地提升效率;
cleanup:Mapper类与Reducer类中都包含了这个方法,该方法在MapReduce程序执行过程中只运行一次,实现Mapper/Reducer类的清尾工作。
2、任务描述
假设输入文本中有若干个单词,要求对文本中的单词求平均长度(单词的长度=字符数)
map输出时,判断单词的首字符是否是字母,如果不是,则不输出;
partition按照单词的首字母进行分区, 这样就可以得到26个分区;
combine内求每个单词的次数和(map端的输出结果求和);
定义26个reduce,reduce0只接收以字母a开头的单词,reduce1只接受以字母b开头的单词;educe内求总长和总次数(每个单词的总长=该单词长度*该单词次数),总长=每个单词的总长和,总次数=每个单词的次数和
reduce的cleanup中:reduce输出平均长度=总长/总次数
这样,得到了26个结果文件,每个文件里只有一个数,即以某字母开头的单词的平均长度。
3、详细代码
3.1 Map端函数
public static class MapClass extends Mapper<LongWritable, Text, Text, IntWritable>
{
private