简单理解mapreduce


刚开始学hadoop时, 一个完全没接触过的同学问我mapreduce到底怎样的? 我一下子没解释清楚, 后来想想可以举个简单例子来说明mapreduce.

比如现在有很多很多普通的扑克牌, 每张都有花色和数字, 共4种花色(除大小王), 13中数字. 这些扑克牌杂乱的混合在一起, 而且存放在多个仓库中, 这是背景.

应用场景一: 现在要统计每种花色有多少张扑克牌, 如何操作?

方法一.

把每个仓库中扑克牌用卡着运到一个控制中心, 然后工作人员一车一车, 一张一张的统计, 最后上报结果.

该方法能够得到正确的结果, 但有两个弊端:
1. 运输成本大. 其他仓库的扑克都要用卡车运输, 的确增加了GDP;
2. 工作分配不均. 控制中心的人忙得要死, 仓库的人却闲的慌, 工资却是一样的, 坑爹啊!

方法二.

每个仓库的工作人员将本仓库中的扑克牌统计好后, 把扑克数按花色分别用飞鸽传书交给控制中心事先确定的汇总中心, 汇总中心的人接收所有仓库的结果, 把按花色将结果分组, 然后依次处理每组的结果, 就可以得到最后的统计结果了.

这个方法的好处就是
1. 运输成本低. 飞鸽传书的量和卡车的比真是小巫见大巫啊;
2. 工作分配均匀. 每个仓库的工作人员都有活干, 不会给钱不干活;

 

回到mapreduce, 方法一是传统的方法, 对应hadoop中, 相当于从hdfs依次读取所有文件到一台主机, 然后分析每一个数据得到结果; 方法二就是mapreduce的思想了, 分两部分.

1. map()+combine()

map()函数的一次执行相当于仓库人员的一次识别扑克, 他们每拿到一张扑克牌, 识别出花色, 然后添加一条记录, 比如方块扑克一张. 这样, 仓库有多少张扑克牌, 就有多少条记录.
combine()函数相当于综合统计, 计算出本仓库中每种花色的总和, 然后再飞鸽传书, 不然这么多记录传, 虽然打包了但鸽子还是要飞瘫掉的;

2. shuffle()+reduce()

shuffle()函数对应汇总中心的人将结果按花色分组, 同是方块的扑克结果放一起, 以待下一步统一处理.
reduce()函数对象汇总中心人员依次处理上一步得到的各个分组,  比如有10个仓库有方块扑克, 并且经shuffle()归入一组, reduce()对这10扑克数结果一个一个处理(相加), 最后得到方块扑克的总数, 其他扑克也一样.
此处reduce只有一个, 如果分配4个汇总中心, 每个中心只处理一种花色, 那每个仓库就要给对应花色的中心传送结果了.

应用场景一比较简单, 复杂点的比如统计每种扑克牌(相同花色和数字)的数量, 对扑克牌排序(首先黑桃>红桃>梅花>方块, 再按数字从大到小), 构造同花顺等等.

 

以上只是用统计扑克的例子简单介绍mapreduce的思想, 一个mapreduce job如下图所示包含4个步骤, DataLoad中涉及InputFormat, 主要是对split的处理; Map对数据按key进行分配; Shuffle对记录整理排序; Reduce汇总记录并输出.

hadoop执行过程

相关内容