mapreduce工作流程:
1.读取文件,从指定路径讲读取文件解析成键值对形式,key为行偏移量,value为每行数据;
2.自定义map逻辑,讲K1,V1转换成map逻辑的K2,V2输出;
3.分区:对K2,V2进行操作,相同数据类型的数据放到同一个区中,继承一个partitioner类;
4.排序:对不同分区的数据按照相同key排序,用到实体类封装时需要实现序列化接口writable,用到比较的话需要继承writablecomparable;
5.规约:对map端输出的K2,V2进行数据聚合,也就是combiner;
6.分组:相同key的value放到同一个集合中;
7.自定义reduce逻辑,将K2,V2,转换成新的k3,v3输出;
8.将k3,v3通过context上下文将数据进行保存;
栗子:
文件:test.txt
文件内容:
a b c
d f a
d a g
当test.txt输入之后,需要将数据进行拆分为K1(行偏移量),V1(每行数据)格式,即:
0,a b c
4, d f a
8, d a g
数据拆分完成之后,到map端将数据按照map端定义的逻辑进行映射为K2(单个数据值),V2(单个数据出现次数不累加统计),即:
a 1
b 1
c 1
d 1
f 1
a 1
d 1
a 1
g 1
combiner聚合阶段:
a ,{1,1,1}
b,{1}
c,{1}
d,{1,1}
f,{1}
g,{1}
renduce阶段:将K2,V2转成新的K3(单个数据),V3(单个数据出现次数累加之和),即:
a,3
b,1
c,1
d,2
f,1
g,1
简言之MapReduce就是“分而治之”,MapReduce分为Map,Reduce,map负责收集统计,只统计不计算,而reduce是负责将map传过来的数据进行计算整合输出!