map-reduce入门 最近在改写mahout源码,感觉自己map-reduce功力不够深厚,因此打算系统学习一下。map-reduce其实是一种编程范式,从统计词频(wordCount)程序来讲解map-reduce的思想最容易理解。 给定一个文件,里面的内容如下,要求统计每个单词的词频。Hello AngelaI love you AngelaHow are you Angela map(每个单词处理为一行,key,value形式)Hello,1Angela,1I,1love,1you,1Angela,1How,1are,1you,1Angela,1 reduce(key相同的行汇在一起)Hello,<1>Angela,<1,1,1>I, <1>love, <1>you, <1,1>How, <1>are, <1> reducer处理后输出Hello,1Angela,3I, 1love, 1you, 2How, 1are, 1 从上可以看到,map阶段和reduce阶段的输入输出数据都是key,value形式的。key的存在是为了标志哪些数据需要汇在一起处理。显然,对于上面统计词频的例子,我们的目的就是让同一个单词的数据落在一起,然后统计该单词出现了多少次。 了解了map-reduce的思想之后,下面来看看分布式的map-reduce是怎样子的。 Hadoop有两类节点,一个jobtracker和一序列的tasktracker。jobtracker调用tasktracker运行任务,如果其中一个tasktracker任务失败了,jobtracker会调度另外一个tasktracker节点重新执行任务。 Hadoop会将输入数据进行分片处理,每个分片是一个等大的数据块,每个分片会分给一个map任务来依次处理里面的每行数据。 一般来说,合理的分片大小趋向于hdfs一个块的大小,默认是64MB。从而使得map任务运行在存有输入数据的节点上,减少数据的网络传输。 如果有多个reduce任务,那么map任务会对输出进行分区,落在同一个分区的数据,留给一个reduce任务处理。当然,相同的key的数据肯定在一个分区中。 map在输出到reduce之前,其实还可以存在一个combine任务,即localreduce,在本地做一次数据合并,从而减少数据的传输。很多时候,combiner和reducer可以是同一个类。 本文作者:linger 本文链接:http://blog.csdn.net/lingerlanlan/article/details/46713733