MapReduce是一种分布式并行计算的编程模型,和分布式文件系统HDFS共同组成了hadoop核心框架,今天看了看印有“谁说大象不能跳舞”的Hadoop,小学习了下MapReduce的总体思想,做一下总结记录下来
根据自己的学习,MapReduce可以编写下面简单案例说明
需求:班上每个同学在期末考试中所有单科所取得的最高单科分数(这里就不要考虑作用,就当选拔单科优秀的人,偏科就偏科好了)
首先,班上有很多同学,每个人的个人资料都不同(比如性别,年龄,姓名等),期末考试有很多科目,每个科目也不同(比如开卷闭卷,分数,pass/no pass等),而我们关心的只是不同的姓名对应的科目分数这一个对应关系
比如原始数据每个老师都有一份以下格式的报告:
姓名 年龄 性别 身高 语文 迟到次数 奖学金次数 通过与否
Tom,23,male,165cm,90,0,2,pass
Lucy,22,femail,155cm,98,1,4,pass
姓名 年龄 性别 身高 数学 迟到次数 奖学金次数 通过与否
Tom,23,male,165cm,91,0,2,pass
Lucy,22,femail,155cm,99,1,4,pass
姓名 年龄 性别 身高 外语 迟到次数 奖学金次数 通过与否
Tom,23,male,165cm,94,0,2,pass
Lucy,22,femail,155cm,97,1,4,pass
…….
其次,由于我们关心的仅仅是同学的姓名和某一科目的考试分数,也就是需要从上面一堆比较繁多的信息当中提取出姓名和分数,并将他们作为输出,这便是map的功能:
(Tom,90)
(Lucy,98)
(Tom,91)
(Lucy,99)
(Tom,94)
(Lucy,97)
然后,此刻每个同学姓名都对应了一个期末考试的分数,但作为reduce的输入,必须在这里还要经过MapReduce的框架进行处理(shuffle?),有一个聚合的过程,使得输出为(key,value-list):
(Tom,[90, 91, 94])
(Lucy,[98, 99, 97])
最后,reduce的输入就是这样每一个姓名后面跟着了一系列的考试分数,之后reduce就会遍历value-list列表,找到最大的值,也就是最高的分数:
(Tom,94)
(Lucy,99)
最终结束将其输出
总结随想:
其实在这个例子当中,我们相当于是首先将所有科目老师手中的同学资料和考试分数都混到了一起(可以这么理解),然后在一个总的输入当中,通过一次map/reduce得到我们输出的结果;假如我们不做一开始的混合,也就是保持每科老师手中的信息分别进行map/reduce,也就是每个科目有关同学的信息和考试分数可以做一次map,然后进行reduce,然后将每个科目有关姓名的输出再来做一个总的reduce,也能得到最终的结果,但更为重要的是每个科目分别进行map/reduce是并行执行的,执行效率和速度提高了N倍,我觉得这才是真正发挥好了MapReduce分布式并行计算的真正能力