由于工作后的第一个任务就是使用Hadoop进行大量的数据处理,其中使用的MapReduce计算框架,这里就简单做了一些总结,网上也有很多大神的总结,这里就当作自己的一个小小积累了。
1.概述
MapReduce采用的是“分而治之”的数据,当我们处理大规模的数据时,将这些数据拆解成多个部分,并利用集群的多个节点同时进行数据处理,然后将各个节点得到的中间结果进行汇总,经过进一步的计算(该计算也是并行进行的),得到最终结果。
map:任务拆解,
reduce:map的结果整合
2.工作过程
MapReduce分成两个阶段Map阶段和Reduce阶段
Map阶段:
1.1.读取hdfs中的文件,然后进行分片(split),每一个分片对应一个Map任务,至于如何分片呢?默认情况下,每一个分片的大小就是hdfs的blocksize,Hadoop2.X,为128M,分片大小也是可以调整的,具体可以参考 这位大神的博客
大数据学习(5)MapReduce切片(Split)和分区(Partitioner)
1.2.读取的文件,每一行为健值对<k1,v1>,调用一次map函数,map函数按照业务逻辑进行编写,处理后,得到新的健值对<k2,v2>。
1.3.根据reduce的数量,默认对k2哈希,对<k2,v2>进行分区(partition),同时也可以自定义分区函数。
1.4.对各个分区内的数据根据k2进行排序和分组,比如同一个分区<apple,1>,<apple,2>,<banana,1>,分组后为<apple,{1,2}>,<banana,1>
1.5.对同一个map任务出来的<k2,v2>进行combine,比如<apple,{1,2}> => <apple,3>,这个combine是可以选的。
reduce阶段:
2.1.将所有节点同一个分区的map数据,通过网络拉取(copy)到同一个reduce节点。从map输出数据到reduce读取数据到过程叫做shuffle。
2.2.然后按照k进行排序,同一个k的数据通过reduce函数进行计算,完成业务逻辑,结果输出新的<k3,v3>。
2.3.最后将<k3,v3>结果入到hdfs。
3.总结
map;
1)split分片,健值对<k,v>
2)mapper计算
3)partitioner
4)sort
5)combiner(可选)
shuffle
map输出数据,根据分区copy到同一个reduce,reduce读取数据
reduce:
1)sort
2)reducer
3)output到hdfs