【MR】经典的MapReduce(MapReduce 1) 运行机制
一,经典的MapReduce
(一)Hadoop MapReduce1采用Master/Slave结构。
Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce1中的JobTracker。
Slave:负责任务的执行和任务状态的回报,即MapReduce1中的TaskTracker。
1,JobTracker:
(1)概述:JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。
(2)JobTracker的主要功能:
1.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。
*最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。
2.资源管理。
2,TaskTracker:
(1)TaskTracker概述:TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。
(2)TaskTracker的功能:
a,汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:机器级别信息:节点健康情况、资源使用情况等。任务级别信息:任务执行进度、任务运行状态等。
b,执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。
(二)MapReduce1工作过程
1,作业提交
job的submit()方法创建一个内部的JobSubmiter实例。并且调用其submitJobInternal()方法,如图步骤1。提交之后,waitForCompletion()每秒轮询作业的进度,如果发现自上次报告后有改动,便把进度报告给控制台。作业完成后,如果成功就显示作业计数器;如果失败则打印失败的原因;
作业提交过程
a,向Jobtracker,调用getNewJobid()请求一个新的作业ID。步骤2
b,检查作业输出说明。比如。没有指定输出目录在或者输出目录已经存在,作业不提交,并把错误抛回给程序。
c,计算作业的输入分片,如果输入路径不存在,无法计算分片。作业不提交,错误抛回给程序。
d,将运行作业所需的资源(包括作业的jar包,配置文件和计算得到的输入分片)复制JobTracker的文件系统中的以作业ID命名的文件目录下。步骤3,其中jar的副本较多。这样可以供TaskTracker选择。
e,JobTracker的submitJob()。作业准备执行。步骤4
2,作业的初始化
初始化过程
a,JobTracker接收到对其submitJob()的调用后,会把此调用放入一个内部队列,有作业调度器进行调度,并对作业进行初始化,包括创建一个表示正在运行作业的对象,封装任务和记录信息,以便跟踪任务状态和进程。步骤5
b,创建任务运行列表,作业调度器首先从文件系统中获取计算好的输入分片,然后为每一个分片创建一个map任务。reduce任务的数量就有Job的mapred.reduce.task属性决定,调用setNumReduceTasks()设置。然后调度器创建相应的数量的reduce任务。同时指定任务ID。
c,除了创建Map任务和Reduce任务外,还创建两个任务:作业创建和作业清理。这两个任务在TaskTracker中执行,在Map任务执行前运行代码来创建作业,并在所有Reduce任务结束后完成清理工作。
3,任务分配
a,TaskTracker通过心跳机制与JobTracker进行通信,心跳向JobTracker表明TaskTracker是否存活,同时TaskTracker也向JobTracker指明是否做好运行新任务的准备。如果是,JobTracker分配一个任务。并且用“心跳”的返回值与TaskTracker通信。步骤7
b,对于map任务和reduce任务,TaskTracker有固定数量的任务槽,TaskTracker可能运行的map任务和reduce任务数量由TaskTracker的核的数量和内存的大小决定。调度器在处理reduce任务前,会将所有map任务槽填满。
c,选择reduce任务,JobTracker会从待运行的reduce任务列表中选取一个reduce任务,而不考虑数据本地化。而对于map任务,JobTracker会选择一个距离输入分片最近的TaskTracker。数据本地化。
4,任务执行
TaskTracker被分配任务后,开始执行任务
a,从文件系统中将要使用到的JAR文件和全部文件复制到TaskTracker的本地文件系统中。步骤8
b,TaskTracker为任务创建一个本地工作目录,并将JAR解压到这个文件夹
c,TaskTracker新建一个TaskRunner实例来运行任务。TaskRunner会启动一个新的JVM(步骤9)来执行任务(步骤10)。以便其他问题都不会影响到TaskTracker。
5,进度和状态的更新
一个作业和每个任务的状态包括:作业或者任务的状态,map和reduce的进度和作业计数器的值。map的任务进度是已经处理输入所占的比例,reduce任务大致可分为三个阶段,复制、排序和输入,每个阶段占1/3。
如果任务报告了进度,就设置一个标志以表明状态变化将被发送到TaskTracker。有一个独立的线程每个3秒就检查一次此标志,如果已设置,则告知TaskTracker当前任务状态,同时TaskTracker通过“心跳”任务状态发送给JobTracker。JobTracker将所有信息汇总,客户端可以通过使用Job的getStatus()得到一个getStatus实例,来获取状态信息。
6,作业完成
当JobTracker收到最后一个任务已经完成的通知后,便把作业的状态设置为“成功”。然后Job查询状态时,便知道作业已经完成,于是Job打印一条信息告知用户,然后waitForCompletion()方法返回,Job的统计信息和计数值也输出到控制台。
最后,JobTracker清空作业的工作状态,指示TaskTracker也清空状态。