1.分布式并行计算
MapReduce框架是由jobTracker和TaskTracker这两类服务调度的。JobTracker是主控服务,只有一个,负责调度和管理TaskTracker,把Map任务和Reduce任务分配给空闲的TaskTmcker,让这些任务并行运行,并负责监控任务的运行情况。TaskTracker是从服务,可以有多个,负责执行任务。如果某个TaskTracker出故障了,JobTracker会把其负责的任务分配给其他空闲的TaskTracker重新运行。
2.本地计算
通常,MapReduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些存储数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常髙效地利用。
3.任务粒度
对于小数据集,一般小于或等于HDFS中数据块的大小,这使得一个小数据集位于一台计算机上,有利于计算的数据本地性。一个小数据集启动一个Map任务,M个Map任务可以在台计算机上并行运行,用户可以指定Reduce任务的数量。
4.Combine (连接)
Combine将Map任务输出的中间结果集中有相同key值的多个<key,value>组合成一个<key,list(value)>对。Combine在执行完Map函数后紧接着执行,很多情况下可以直接使用Reduce函数,Combine能减少中间结果的数量,从而减少数据传输中的网络流量。
5.Partition (分区)
Combine之后,把产生的中间结果按key的范围划分成及份(及是预先定义的Reduce任务的个数)。划分时通常使用Hash函数,如hash(key)mod R,这样可以保证某一范围内的key,一定是由一个Reduce任务来处理,可以简化Reduce的过程。
6.读取中间结果
Map任务的中间结果在做完Combine和Partition之后,以文件形式存于本地磁盘。中间结果文件的位置会通知主控JobTracker,JobTracker再通知Reduce任务到哪一个DataNode上去取中间结果。注意所有的Map任务产生中间结果均按其key用同一个Hash函数划分成了R份,R个Reduce任务各自负责一段key区间。每个Reduce需要向多个Map任务节点取得落在其负责的key区间内的中间结果,然后执行Reduce函数,形成一个最终的结果文件。
7.任务管道
在某些情况下Reduce任务的输出结果并非所需要的最终结果,这时可以将这些输出结果作为另一个计算任务的输入开始另一个MaPReduce计算任务。