【Hadoop权威指南】MapReduce的工作机制

来源:互联网 发布:java静态常量存储 编辑:程序博客网 时间:2024/05/24 23:14

MapReduce的工作机制

MapReduce作业运行机制


MapReduce作业的工作原理

整个MapReduce过程包括4个实体:

1. 客户端:提交MapReduce作业

2. jobtracker:协调作业的运行

3. tasktracker:运行作业划分后的任务

4. HDFS:实体间共享作业文件

作业的的提交

JobClientrunJob方法是用于新建JobClient实例并调用其submitJob方法的快捷方式。

JobClientsubmitJob方法实现的作业提交过程如下:

1. jobtracker请求一个新的作业ID

2. 检查作业的输出说明,即输出目录存在与否

3. 计算作业反而输入分片

4. 将作业运行所提交的资源复制到一个以作业ID命名的jobtracker的文件系统中

5. 告知jobtracker作业准备运行

作业的初始化

作业提交后,会放入一个内部队列,交由作业调度器处理,并对其初始化。

初始化包括创建一个表示正在运行作业的对象封装任务和记录信息。

为了创建任务运行列表。作业调度器首先从共享文件系统中获取JobClient已计算好的分片信息,然后为每个分片创建一个map任务。reduce任务数量是由JobConfmapred.reduce.task属性决定的。

任务的分配

tasktracker运行一个简单的循环来定期发送“心跳”给jobtrackerjobtracker会为收到心跳的tasktracker分配一个任务,并使用心跳的返回值与tasktracker通信。

tasktracker有个固定数量的任务槽,默认调度器在处理reduce的任务槽之前,会填满空闲的map任务槽,因此,如果tasktracker至少有一个空闲的map任务槽,jobtracker就会为它选择一个map任务,否则选择一个reduce任务。

为了选择一个reduce任务,jobtracker会简单地从待运行的reduce任务列表中去下一个来执行,不必考虑数据的本地化。对于map任务,jobtracker会考虑tasktracker的网络位置。

任务队执行

1. 通过共享文件系统将作业的jar文件复制到tasktracker的文件系统,从而实现jar文件本地化。同时,tasktracker将应用程序所需要的全部文件从分布式缓存复制到本地。

2. tasktracker为新任务创建一个本地工作目录,并把jar文件的内容解压到该目录

3. 新建一个TaskRunner实例来运行该任务

进度和状态的更新

每个作业和它的每个任务都有一个状态,包括其状态、mapreduce的进度、作业计数器的值、消息状态。

tasktracker每个五秒发送心跳给jobtracker,报告所有任务的状态


状态更新在MapReduce中传递的流程

失败

任务失败

任务抛出异常,JVM在退出之前,向其父tasktracker发送错误报告,记入日志,tasktracker将此次task attempt记为failed,释放任务槽,运行另一个任务。

如果是JVM突然退出,那么tasktracker会注意到进程已经退出,将此次尝试标记为failed

如果出现超时,被挂起的任务长时间不会释放它的任务槽,应避免这种设置,同时保证每个任务定期汇报进度。

tasktracker失败

jobtracker会注意到已经停止发送心跳的他上课,并将它从等待任务调度的池中移除。

如果是未完成的作业,jobtracker会安排比此tasktracker上已经运行并完成的任务重新运行,因为reduce任务无法访问。

jobtracker失败

作业注定失败

作业的调度

MapReduce有多种调度器可供选择,默认是基于队列的FIFO,还有两个用户调度器,分别名为Fail SchedulerCapacity Scheduler

Fair Scheduler支持抢占,作业都被放在作业池中,让每个用户公平共享集群。

Capacity Scheduler:集群有许多杜列组成,每个队列有一个分配能力,每个作业内部是FIFO

shuffle和排序

MapReduce确保每个reducer的输入都按键排序,将map输出传递给reducer的过程叫shuffle


任务的执行

Hadoop不会尝试诊断或修复慢的任务,相反,一个任务比预期慢的时候,他会尽量检测,并启动另一相同的任务备份,这就是所谓的“推测执行”。

原创粉丝点击