1、MapReduce是什么?(What is MapReduce)
MapReduce是一个用于对海量数据并行计算的编程模型,核心操作是Map和Reduce
Map: 负责把任务分解成多个任务
Reduce: 负责把分解后的多任务处理的结果汇总起来。
至于在并行编程中的其他复杂问题,如分布式存储、工作调度、负载均衡、容错处理、网络通信等,由MapReduce框架负责处理,而程序员可以不关心这些问题。
MapReduce致力于解决大规模数据处理的问题,因此在设计之初就考虑了数据的局部性原理,利用局部性原理将整个问题分而治之。MapReduce集群由普通PC构成,为无共享式架构。在处理之前,将数据集分布至各个节点。处理时,每个节点就近读取本地存储的数据处理,将处理后的数据进行合并、排序后再分发(至reduce节点),从而避免了大量数据的传输,提高了处理效率。无共享式架构的另一个好处是配合复制策略,集群可以具有良好的容错性,一部分节点对集群的正常工作不会造成影响。
2、MapReduce的集群行为
MapReduce运行在大规模集群之上,要完成一个并行计算,还需要任务调度、本地计算、洗牌过程等一系列环节共同支撑的计算的过程,把上述过程称为MapReduce的集群行为。
1)任务调度与执行
MapReduce任务由一个JobTracker和多个TaskTracker两类节点控制完成。
①JobTracker节点
JobTracker节点主要负责和管理TaskTracker,它通常是运行在master节点上的。JobTracker将Mapper和Reducer分配给空闲的TaskTracker后,由TaskTracker负责这些任务的并行执行。
②TaskTracker节点
TaskTracker节点必须运行在DataNode节点上,所以说DataNode既是数据的存储节点,也是计算节点。
③JobTracker节点与TaskTracker之间的关系
JobTracker负责监控任务的运行状况,如果某个TaskTracker发生故障,JobTracker就会将其负责的任务分配给其他空闲的TaskTracker重新运行。
2)本地计算
把计算节点和数据节点置于同一台计算机上,MapReduce框架尽量保证存储的数据节点执行计算任务,从而有效地减少了数据在网络中的传输,降低了对宽带的需求,避免了网络“瓶颈”。采用“本地计算”可以有效地节约宽带。在通常情况下split块应该小于或等于HDFS数据块的大小,从而保证了split不会跨越两台计算机存储,便于“本地计算”。
3)shuffle洗牌过程
MapReduce会将Mapper的输出结果安装key值分成R份,其中R是预先定义的 Reducers的个数,划分时常用哈希函数,如 Hash(Key)mod R。这样可以保证某一个范围内的key一定由某个Reducer来处理,从而简化Reduce的过程。
4)合并Mapper输出
MapReduce允许在shuffle之前先对结果进行合并,即将中间结果中有相同key值的多组<key,value>对合并成一对。Combine过程和Reduce过程类似,很多情况下可以直接使用reduce函数。但Combine过程是Mapper的一部分,在map函数之后执行。Combine过程可以有效地减少中间结果的数量,从而减少数据传输过程中的网络流量。值得注意的是,MapReduce并不保证其会对一个Mapper输出执行多少个Combine过程。
5)读取中间结果在完成合并Combine和Shuffle的过程后,Mapper的输出结果被直接写到本地磁盘。然后通知JobTracker中间结果文件的位置,再由JobTracker告知Reducer到哪个DataNode上去取中间结果。注意所有的Mapper产生的中间结果均按key值用同一个哈希函数划分为R份,R个Reduce各自负责一段key值区间。每个Reduce需要向多个Mapper节点取得key值区间的中间结果,然后执行Reduce函数,最终形成一个结果文件。
6)任务管道
R个Reduce会产生R个结果,很多情况下着R个结果并不是所需要的最终结果,而是会将这R个结果作为另一个计算任务的输入,并开始另一个MapReduce的任务。