MapReduce编程规范及示例编写
一、编程规范
mapReduce编程模型的总结
事实上MapReduce的开发一共有八个步骤其中map阶段分为2个步骤,shuffle阶段4个步骤,reduce阶段分为2个步骤
- Map 阶段步骤
第一步:设置inputFormat类,将数据切分成key,value对,输入到第二步
第二步:自定义map逻辑,处理第一步的输入数据,然后转换成新的key,value对进行输出
- shuffle阶段4个步骤(可以全部不用管)
第三步:对输出的key,value对进行分区。相同key的数据发送到同一个reduce里面去,相同key合并,value形成一个集合
第四步:对不同分区的数据按照相同的key进行排序
第五步:对分组后的数据进行规约(combine操作),降低数据的网络拷贝(可选步骤)
第六步:对排序后的额数据进行分组,分组的过程中,将相同key的value放到一个集合当中
- reduce阶段2个步骤
第七步:对多个map的任务进行合并,排序,写reduce函数自己的逻辑,对输入的key,value对进行处理,转换成新的key,value对进行输出
第八步:设置outputformat将输出的key,value对数据进行保存到文件中
八个步骤总体流程
MapReduce从读取数据开始到将最终结果写入HDFS经过步骤
第一步:InputFormat
InputFormat 在HDFS文件系统中读取要进行计算的数据
输出给Split
第二步:Split
Split 将数据进行逻辑切分,切分成多个任务。
输出给RR
第三步:RR
RR 将切分后的数据转换成key value进行输出
key : 每一行行首字母的偏移量
value: 每一行数据
输出给Map
第四步:Map
接收一条一条的数据(有多少行数据Map运行多少次,输出的次数根据实际业务需求而定)
根域业务需求编写代码
Map的输出是 key value的 list
输出给Shuffle(partition)
---------------------------------------Map-------------------------------------------------------
第五步: partition
partition: 按照一定的规则对 **key value的 list进行分区
输出给Shuffle(sort)
第六步:Sort
Sort :对每个分区内的数据进行排序。
输出给Shuffle(Combiner)
第七步:Combiner
Combiner: 在Map端进行局部聚合(汇总)
目的是为了减少网络带宽的开销
输出给Shuffle(Group)
第八步:Group
Group: 将相同key的key提取出来作为唯一的key
将相同key对应的value提取出来组装成一个value 的List
输出给Shuffle(reduce)
------------------------------------Shuffle--------------------------------------------
第九步:reduce
reduce: 根据业务需求对传入的数据进行汇总计算。
输出给Shuffle(outputFormat)
第十步:outputFormat
outputFormat:将最终的额结果写入HDFS
------------------------------------reduce--------------------------------------------
二、编程实例
Mapper以及Reducer抽象类介绍
为了开发MapReduce程序,一共可以分为以上八个步骤,其中每个步骤都是一个class类,通过job对象将程序组装成一个任务提交即可。为了简化MapReduce程序的开发,每一个步骤的class类,都有一个既定的父类,直接继承即可,因此可以大大简化MapReduce程序的开发难度,也可以快速的实现功能开发。
MapReduce编程当中,其中最重要的两个步骤就是Mapper类和Reducer类
1、 Mapper抽象类的基本介绍
在hadoop2.x当中Mapper类是一个抽象类,工程师只需要覆写一个java类,继承自Mapper类即可,然后重写里面的一些方法,就可以实现特定的功能,接下来介绍一下Mapper类当中比较重要的四个方法
- setup方法:
Mapper类当中的初始化方法,程序中一些对象的初始化工作都可以放到这个方法里面来实现 - map方法:
读取的每一行数据,都会来调用一次map方法,这个方法也是最重要的方法,可以通过这个方法来实现每一条数据的处理。 - cleanup方法:
在整个maptask执行完成之后,会马上调用cleanup方法,这个方法主要是做一些清理工作,例如连接的断开,资源的关闭等等 - run方法:
如果需要更精细的控制整个MapTask的执行,那么可以覆写这个方法,实现对所有的MapTask更精确的操作控制
2、Reducer抽象类基本介绍
同样的道理,在hadoop2.x当中,reducer类也是一个抽象类,抽象类允许工程师可以继承这个抽象类之后,重新覆写抽象类当中的方法,实现逻辑的自定义控制。接下来也来介绍一下Reducer抽象类当中的四个抽象方法
- setup方法:
在ReduceTask初始化之后马上调用,一些对象的初始化工作,可以在这个类当中实现 - reduce方法:
所有从MapTask发送过来的数据,都会调用reduce方法,这个方法也是reduce当中最重要的方法,可以通过这个方法实现数据的处理 - cleanup方法:
在整个ReduceTask执行完成之后,会马上调用cleanup方法,这个方法主要就是在reduce阶段做一些清理工作,例如连接的断开,资源的关闭等等 - run方法:
如果需要更精细的控制整个ReduceTask的执行,那