MapReduce执行过程
MapReduce之Map阶段执行过程
1:框架会把输入文件(夹)划分为很多InputSplit,默认,每个HDFS的Block对应一个InputSplit。通过RecordReader类,把每个InputSplit解析成一个个<K1,V1>。默认,每一行会被解析成一个<K1,V1>。
2:框架调用Mapper类中的map(...)函数,map函数的形参是<K1,V1>,输出是<K2,V2>。一个InputSplit对应一个map task。
3:框架对map函数输出的<K2,V2>进行分区。不同分区中的<K2,V2>由不同的reduce task处理,默认只有一个分区。
4:框架对每个分区中的数据,按照K2进行排序、分组。分组指的是相同K2的V2分成一个组。
5:在map节点,框架可以执行reduce归约,此步骤为可选顶。
6:框架会把map task输出的<K2,V2>写入到Linux的磁盘文件中。
至此,整个map阶段结束。
--------------------------------------------------------------------------
整个MapTask分为Read阶段,Map阶段,Collect阶段,溢写(spill)阶段和combine阶段
1:Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value
2:Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value
3:Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中
4:Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作
MapReduce之Reduce阶段执行过程
1:框架对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点,这个过程称作shuffle。
2:框架对reduce端接收到的相同分区的<K2,V2>数据进行合并、排序、分组。
3:框架调用Reducer类中的reduce方法,输入<K2,{V2...}>,输出<K3,V3>。一个<K2,{V2...}>调用一次reduce函数。
4:框架把reduce的输出保存到HDFS中。
至此,整个reduce阶段结束。
--------------------------------------------------------------------------
整个ReduceTask分为Copy阶段,Merge阶段,Sort阶段(Merge和Sort可以合并为一个),Reduce阶段。
1:Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中
2:Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多
3:Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可
4:Reduce阶段:reduce()函数将计算结果写到HDFS上
-----------------------------------------------------------
个人网址:http://wxson.cn(待开通)
-----------------------------------------------------------
个人网址:http://wxson.cn(待开通)
-----------------------------------------------------------