MapReduce作业运行机制

1、mapreduce的体系结构

2、mapreduce作业运行机制
2.1运行图

2.2运行解析

2.2.1作业的提交
1)此方法 调用submit(). 在Submit()方法里面连接JobTracker,即生成一个内部JobSummitter(实际上是new JobClient(),在new           JobClient()里面生成一个JobSubmissionProtocol接口(JobTracker实现了此接口)对象jobSubmitClient(是它连接或对应着JobTracker)),在Submit()方法里面也调用JobClient.submitJobInternal(conf)方法返回一个RunningJob(步骤1)
2)参数true说明要调用方法jobClient.monitorAndPrintJob()即检查作业的运行情况(每秒一次),如果有变化就报告给控制台
jobClient.submitJobInternal()所实现的提交作业过程如下:
3)  向Jobtracker请求一个新的job ID(步骤2)
4)  检查作业的输出路径,如果未指定或已存在则不提交作业并抛错误给程序;
5)  计算并生成作业的输入分片,如果路径不存在则不提交作业并抛错误给程序;
6) 将运行作业所需要的 资源(包括作业jar文件,配置文件和计算所得的输入分片) 复制到jobtracker的文件系统中以job id命名的目录下(即 HDFS中)。作业jar副本较多(mapred.submit.replication = 10)(步骤3)
7) 告知jobtracker作业准备执行( 真正的提交作业jobSubmitClient.submitJob())(步骤4)

2.2.3作业的初始化
1)jobtracker接收到对其submitJob()方法的调用后, 将其放入内部队列,交由job scheduler进行调度,并对其进行初始化,包括创建一个正在运行作业的对象---封装任务和记录信息(步骤5)
2)为了创建任务运行列表,job scheduler首先从共享文件系统中获取已计算好的 输入分片信息(步骤6),然后为每个分片创建一个map任务
3)创建的reduce任务数量由Job的mapred.reduce.task属性决定(setNumReduceTasks()设置), schedule创建相应数量的reduce任务。 任务在此时被指定ID。
4)除了map和reduce任务,还有 setupJob和cleanupJob需要建立:由tasktrackers在所有map开始前和所有reduce结束后分别执行,这两个方法在OutputCommitter中(默认是FileOutputCommitter)。setupJob()创建输出目录和任务的临时工作目录,cleanupJob()删除临时工作目录。

2.2.4作业的分配
1)每个tasktracker 定期发送 心跳给jobtracker,告知自己还活着,并附带消息说明自己是否已准备好接受新任务。jobtracker以此来分配任务,并使用心跳的返回值与tasktracker通信(步骤7)。Jobtracker利用调度算法先选择一个job然后再选此job的一个task分配给tasktracker.
2)每个tasktracker会有固定数量的map和reduce任务槽,数量有tasktracker核的数量和内存大小来决定。jobtracker会 先将tasktracker的所有的map槽填满,然后才填此tasktracker的reduce任务槽。
3)Jobtracker分配map任务时会选取与输入分片最近的tasktracker,分配reduce任务用不着考虑数据本地化。

2.2.5任务的执行
用到上面提到的setupJob()
1) tasktracker分配到一个任务后,首先从HDFS中把作业的jar文件及运行所需要的全部文件(DistributedCache设置的)复制到tasktracker本地(步骤8);
2) 接下来tasktracker为任务新建一个本地工作目录,并把jar文件的内容解压到这个文件夹下;
3) tasktracker新建一个taskRunner实例来运行该任务(步骤9);
4) TaskRunner启动一个新的JVM来运行每个任务(步骤10),以便客户的map/reduce不会影响tasktracker。

2.2.6进度和状态的更新
一个作业和它的每个任务都有一个状态,包括:作业或任务的运行状态(running, successful, failed),map和reduce的进度,计数器值,状态消息或描述。
map进度标准是处理输入所占比例,reduce是copy\merge\reduce整个进度的比例。
Child JVM有独立的线程每隔3秒检查任务更新标志,如果有更新就会报告给此tasktracker;
tasktracker每隔5秒给jobtracker发心跳;
job tracker合并这些更新,产生一个表明所有运行作业及其任务状态的全局试图。
JobClient.monitorAndPrintJob()每秒查询这些信息。

2.2.7作业的完成
当jobtracker收到最后一个任务(this will be the special job cleanup task)的完成报告后,便把job状态设置为successful。
Job得到完成信息便从waitForCompletion()返回。
最后,jobtracker清空作业的工作状态,并指示tasktracker也清空作业的工作状态(如删除中间输出)。


2.3失败解析

2.3.1 任务失败
1)子任务失败。当map或者reduce子任务中的代码抛出异常,JVM进程会在退出之前向服进程tasktracker进程发送错误报告,tasktracker会将此(任务尝试)task attempt标记为failed状态,释放一个槽以便运行另外一个任务
2)jvm失败。JVM突然退出,即JVM错误,这时tasktracker会注意到进程已经退出,标记为failed
另外:
1)任务失败有重试机制,重试次数map任务设置是mapred.map.max.attempts属性控制,reduce是mapred.reduce.max.attempts属性控制。
2)一些job可以任务完成总体的一部分就能够接受,这个百分比由mapred.map.failures.precent和mapred.reduce.failures.precent参数控制。
3)任务尝试(task attempt)是可以中止(killed)的。

2.3.2 tasktracker失败
作业运行期间,tasktracker会通过心跳机制不断与系统jobtracker通信,如果某个tasktracker运行缓慢或者失败,出现故障。tasktracker就会停止或者很少想jobtracker发送心跳,jobtracker会注意到此tasktracker发送心跳的情况,从而将此tasktracker从等待任务调度的tasktracker池中移除,
1) 如果是map并且成功完成的话, jobtracker会安排此tasktracker上一成功运行的map任务返回
2) 如果是reduce并且成功的话,数据直接使用,因为reduce只要执行完了的就会把输出写到Hdfs上
3) 如果他们属于未完成的作业的话,reduce阶段无法获取改tasktracker上的本地map输出文件,任何任务都需要重新调度
另外,即使tasktracker没有失败,如果它上面的失败任务远远高于集群的平均失败任务数,也会被列入黑名单。可以通过重启从jobtracker的黑名单移除。

2.3.3 jobtracker失败
jobtracker失败应该说是最严重的一种失败方式了,而且在Hadoop中存在单点故障的情况下是相当严重的,因为在这种情况下作业最终失败,尽管这种故障的概率极小。未来版本可以通过启动多个jobtracker,在这种情况只运行一个主的jobtracker.通过一种机制来确定那个是主的jobtracker.








  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值