JobTracker 内部使用三层表示:

JobInProgress: 跟踪和监控作业运行状态的对象。每个Job分成了多个Task。并为每个Task创建一个TaskInProgress跟踪和监控其运行状态。

而Task在运行过程中由于多种原因,比如软件Bug,硬件故障、推测机制等,每个Task可能尝试运行多次,直到运行成功或者超过尝试次数而失败。

每次的尝试为TaskAttemp。

作业使用JobId区分,JobId : job的前缀字符串、JobTracker启动时间和作业提交顺序。

比如job_20128071706_0009

每个任务使用TaskID来区分, TaskID: JobID(前缀字符串为task)、任务类型(map 或者redice) 任务编号

比如task_201208071706_0009_m_000000  表示上面JobId表示的一个Job的一个Task

TaskAttemp也是用ID来区分,TaskAttemptID: 任务ID(前缀字符串attempt) 和运行尝试次数(从0开始)

比如 attempt_201208071706_0009_m_000000_0 表示上面TaskID表示的Task的一次尝试。

 

JobTracker的容错

  从作业的恢复粒度,当前存在三种不同级别的恢复机制,按照级别从低到高依次为

  1. 作业级别: 将作业分成挖成的未完成的。对未完成的作业全部重新执行(包括作业中已经完成的Task)。
  2. 任务级别:将任务分为完成的任务和未完成的任务。仅对未完成的任务重新执行。
  3. 记录级别:仅对Task中未处理的记录重新执行。(学术研究中)

   级别越低实现越简单,但是资源的浪费越严重。目前简化设计考虑,采用的是作业级别的恢复机制。

任务推测执行

为解决部分作业慢拖后腿的问题,提出了任务推测执行机制。为拖后的任务启动一个备份任务。该任务和原始任务同时处理同一份数据,最终选用先成功运行完成的任务的计算结果作为最终的结果。

     该问题出现的原因为Hadoop设计上的假设

  1. 每个节点的计算能力是一样的
  2. 任务的执行进度随时间线性增加
  3. 启动一个备份任务的代价可以忽略不计
  4. 一个任务的进度可以表示成已完成工作量占总工作量的比例。
  5. 同一个作业的同种类型的任务的工作量是一样的。所用时间也相同。

    实际情况是复杂的,由于集群异构或者负载不均衡,就会产生问题。

  hadoop 1.0.0的算法

        一个任务同时满足以下添加,就会为该任务启动一个备份任务:

  1. 该任务尚未进入skip mode(由于推测执行机制和跳过坏记录机制均会拖慢任务执行进度,考虑到性能问题,不会同时启用这两个功能)
  2. 该任务没有其他正在运行的备份任务(当前Hadoop最多允许一个任务同时启动两个Task Attempt)
  3. 该任务已经运行时间超过60 s,并且当前正在运行的Task Attempt落后(通作业内所有TaskAttempt)平均进度的20%。

   当任务的某个Task Attempt成功运行后,JobTracker会杀掉另外一个Task Attempt

      上面算法的问题是:

  1. 20% 空间问题。即当作业内大部分任务已经完成,而若干个Task Attempt的进度已经大于等于80%,则永远不会触发启动备份任务。
  2. 缺乏保证备份任务执行速度的机制:新启动的备份任务需要首先处理原始Task Attempt已经处理完的数据,因此需要保证备份任务的运行速度不低于原始Task Attempt,否则就没有必要启动备份任务。
  3. 参数不可配置: 即设定的20%% 和60s都是不可配置的。不能满足用户根据自己集群特点定制参数的要求

0.21.0版本的算法

    配置选项

  1. mapreduce.job.speculative.slownodethreshold : 任意一个TaskTracker 已完成任务的平均进度增长率和所有已完成任务的平均进度增长率的最大允许差距。 默认为1. 超过阈值时标明该TaskTracker的性能比较低,不会在其上启动一个备份任务。
  2. mapreduce.job.speculative.slowtaskthreshold: 作业的任意一个任务的平均进度增长率与所有正在运行任务的平均进度增长率的最大允许差距。默认为1.超过阈值标明该任务运行过慢,需要启动一个备份任务。
  3. mapreduce.job.speculative.speculativecap: 限定作业允许启动备份任务的任务数目占正在运行任务的百分比。默认为0.1,即为一个作业启动推测执行功能的任务数不能超过过正在运行任务的10%

   启动备份任务

  1. 判断Task Tracker X是否是一个慢Task Tracker,如果是,则不能启动任何备份任务
  2. 检查作业J 是否启动的备份任务数超过限制。
  3. 筛选出作业J总满足调价的任务保存在数据candidates中
    1. 该任务未在TaskTracker X上运行失败过。
    2. 该任务没有其他正在运行的备份任务
    3. 该任务以运行时间超过60s
    4. 该任务已经出现拖后腿现象。
  4. 按照运行剩余时间从大到小对candidates中的任务派讯,选择剩余时间最大的任务为其启动备份任务。

     该算法的缺点是:

  1. 任务进度和剩余时间估算不准确,导致部分正常任务被误认为是拖后腿,从而造成资源浪费
  2. 未针对任务类型节点分类: 即需要对Map Task和Reduce Task区分,对于Map Task是慢节点的,对Reduce Task也许是快节点。

2.0 版本的算法

    重点关注备份任务是否有潜力比当前正在运行的任务完成的更早。

 

调度策略

  1. 针对Map Task 考虑数据本地性
  2. Map task选择策略
    1. 优先选择运行失败的任务
    2. 其次是尚未运行的任务
    3. 最后是正在运行的任务,为拖后腿的任务启动备份任务
  3. Reduce Task 选择策略 从未运行的任务列表中选择第一个满足条件的任务。

hadoop–JobTracker 相关的更多相关文章

  1. hadoop以及相关组件介绍以及个人理解

    前言 本人是由java后端转型大数据方向,目前也有近一年半时间了,不过我平时的开发平台是阿里云的Maxcompute,通过这么长时间的开发,对数据仓库也有了一定的理解,ETL这些经验还算比较丰富.但是 ...

  2. Hadoop及其相关组件简介

    一.大数据介绍 1.大数据指的是所涉及的数据量规模巨大到无法通过人工,在合理时间内达到截取.管理.处理.并整理成为人类所能解读的形式的信息. 2.大数据,可帮助我们能察觉商业趋势.判断研究质量.避免疾 ...

  3. 通过Hadoop jmx收集Namenode,Jobtracker相关信息

    经常会有一些Hadoop监控的需求,例如datanode节点掉线,Tasktracker blacklist的数量,以及Namenode,Jobtracker的内存GC信息等. 之前采用Hadoop ...

  4. Hadoop开发相关问题

    总结自己在Hadoop开发中遇到的问题,主要在mapreduce代码执行方面.大部分来自日常代码执行错误的解决方法,还有一些是对Java.Hadoop剖析.对于问题,通过查询stackoverflow ...

  5. hadoop data 相关开源项目(近期学习计划)

    计划学习几个hadoop相关的开源项目: 1.spring hadoop 2.spring batch 3.spring redis 4.spring mongo 相关项目样例:https://git ...

  6. Hadoop JobTracker和NameNode运行时参数查看

      1)JobTracker运行时参数: hadoop@ubuntu:/home/zhangchao3$ ps -ef | grep job hadoop 29563 1 0 11:34 pts/12 ...

  7. Hadoop–TaskTracker 相关

    TaskTracker 是Hadoop集群中运行于各个节点上的服务.他是JobTracker和Task之间的"通信桥梁".一方面它从JobTracker端接受并执行各种命令:比如运 ...

  8. Hadoop 中文编码相关问题 -- mapreduce程序处理GBK编码数据并输出GBK编码数据(转)

    hadoop的hdfs文件系统中,默认的是utf-8, 故你上传的文件是要设置成utf-8.当输入的是gbk,有该如何? 输入是GBK文件, 输出也是 GBK 文件的示例代码: Hadoop处理GBK ...

  9. hadoop的相关资料链接

    hadoop的资料整理博客 http://www.itpub.net/thread-1588509-1-1.html

随机推荐

  1. SpringCloud-技术专区-Hystrix-使用指南

    Maven依赖配置 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId ...

  2. linux学习总结--linux100day(day1)

    写在前面:我是一名在学习linux的小学生,最近在学习python时,我的老师推荐了github上的一本教材“python100day”,100day里面的内容由浅入深,且都具备详细的例子,对于我这个 ...

  3. vue 页面回退mounted函数不执行的问题及解决方法

    前言 最近做项目碰到一个很头大的问题--从a页面跳到b页面进行编辑,编辑完再返回a页面,却没走a页面的钩子函数mounted,数据没有更新 经过一番面向百度研究,终于找到了问题所在.接下来就记录一下这 ...

  4. 【leetcode】388. Longest Absolute File Path

    题目如下: Suppose we abstract our file system by a string in the following manner: The string "dir\ ...

  5. vue基础三

    1.模板语法 在底层的实现上, Vue 将模板编译成虚拟 DOM 渲染函数.如果你熟悉虚拟 DOM 并且偏爱 JavaScript 的原始力量,你也可以不用模板,直接写渲染(render)函数,使用可 ...

  6. 思维+双指针+环——cf1244F

    /* 可以发现一个性质:连续两个相同色块永远不会变色 继而可以发现,这个色段每次迭代都向左向右拓展长度1,直到撞上其他扩张的色段 所以预处理出所有连续色段,然后对于所有不在色段里的点,我们可以预测其最 ...

  7. 线段树双tag+差分数组——cf1208E

    写了一上午 /* 对于每个数组a[],先排序然后从大到小把a[i]放进线段树更新 设a[i]的位置是pos,那么其可更新的区间是[pos,w-(li-pos)] 线段树结点保存 tag=now表示当前 ...

  8. CF B. Planning The Expedition

    题意:有n个人和m个食物,给出每一个食物的种类,每个人只会吃一种食物,每个人一天吃一个食物,问这n个人可以撑多少天. 分析:因为题目给出的天数范围比较小所以我们可以从1到100天开始枚举,我们判断如果 ...

  9. Go语言中接口组合的实现方法

    在Go语言中,可以在接口A中组合其它的一个或多个接口(如接口B.C),这种方式等价于在接口A中添加接口B.C中声明的方法. 代码如下: //接口中可以组合其它接口,这种方式等效于在接口中添加其它接口的 ...

  10. anaconda里的python版本回退, requirements

    事情起因:我用的python3.7 , 同事机器学习的部分使用tensorflow,只支持python3.6, 所以我从3.7回退到3.6 conda create -n python36 pytho ...