map-reduce是hadoop分布式应用操作的核心,其中心思想是,基于分布式hdfs存储系统,map任务在hdfs各个节点中独立并行,对数据进行分布式处理,处理结果交由reduce任务进行整合处理。这样看来,MapReduce分布式处理的高效主要体现在map任务中。
mapreduce工作时以job为单位进行,在客户端配置job相关信息类JobConf,配置完成后,JobClient.runJob(jobConf)即可运行mapreduce作业。其过程大致如下:
1.客户端将job提交到JobTracker节点 2.JobTracker将job相关信息封装成一个对象,加入到作业队列中 3.JobTracker内作业调度器根据JobClient计算好的数据分区信息,为每个分区创建一个map任务,reduce任务数量由配置决定 4.JobTracker根据分区数据所在节点分配最近的TaskTracker执行map任务,最佳情况下,二者在同一节点 5.TaskTracker中有固定数量的槽,用来运行map和reduce任务;TaskTracker接到任务后默认会创建TaskRunner对象,创建新的jvm执行任务,为了避免干扰,一个jvm对应一个任务;可以配置每个jvm最多执行任务数,默认为1 6.TaskTracker通过每隔一段时间与JobTracker发送“心跳”进行通信,其中包括任务执行进度和状态等。当任务失败时,JobTracker会重新分配任务给其他节点。 7.Map任务中将map函数执行完毕之后,会对输出的值进行shuffle,默认是进行按键排序。 8.map任务会设置一个缓冲区用来存放中间输出,缓冲区中数据量达到一定百分比之后,会将数据写入到磁盘中。combiner会在这之前执行 9.map执行完成后,输出通过网络传递到reduce任务节点作为输入数据。
在hdfs中,每个文件分区地存储在不同DataNode中,NameNode中存放这些位置信息。JobTracker内作业调度器分配map任务时,先根据客户端计算好的分区信息,根据分区数量,划分并分配map任务;理想情况下,每一个map任务执行节点TaskTracker与其数据存放节点DataNode是同一个节点。
TaskTraceker中有一定数量的槽,用来执行map或reduce任务。当任务分配下来之后,创建一个TaskRunner来启动JVM虚拟机执行任务。执行任务过程中,每隔段时间向JobTracker发送任务进度以及状态,JobTracker也由此判断TaskTracker是否可用。若TaskTracker遇到异常执行任务失败,将任务状态设置为失败并通知JobTracker,JobTracker将重新分配该任务给其他节点。如果JobTracker十分钟(可以设置)未收到TaskTracker的反馈,则判定任务失败。
在集群节点超过4000个时,JobTracker将达到极限,影响可伸缩性,由此在hadoop2.2版本之后,map-reduce基于yarn进行实现,将JobTracker和TaskTracker替换为ResourceManager、NodeManager、ApplicationMaster。
参考资料:《hadoop权威指南》第六、七、八章