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. Python建立Tab自动补全的脚本

    Python建立Tab自动补全的脚本 #!/usr/bin/python #python steup file import sys import readline import rlcomplete ...

  2. Spring学习笔记(7)——Bean的基本配置

            先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就 ...

  3. bat批处理----set

    转载自    https://www.cnblogs.com/Braveliu/p/5081084.html [1]set命令简介 set,设置. [2]set命令使用 1. 打印系统环境变量.set ...

  4. Javascript中的Date()对象

    创建一个指定的事件对象 需要在构造函数中传递一个表示时间的字符串作为参数例:var d2=new Date("8/27/2019"); 如果直接使用构造函数创建一个Date对象,则 ...

  5. Linux面试基础(一)

    Linux基本命令 man rm   查看命令帮助 tar cf 压缩文件 tar xf 解压缩 ping  查看是否能连接网络 rm           删除数据 find          搜索数 ...

  6. 让所有Excel数据格全部乘 某个数

    1  首先设置单元格格式要是数字 2  然后在随便一个单元格写入你要乘的数字 3  粘贴的时候设置选择性粘贴,然后设置乘就OK

  7. 在AndroidStudio2.3.2下JNI开发的详细步骤(转)

    转自:http://blog.csdn.net/luhaoying1111/article/details/72468867 安装NDK 在工具栏点击File->Settings->App ...

  8. 【Nacos】本地集群部署

    关于Nacos已经展开了四篇入门文章: 初探Nacos(一)-- 单机模式启动 初探Nacos(二)-- SpringCloud使用Nacos的服务注册与发现 初探Nacos(三)-- SpringB ...

  9. Android_开发片段(Part 3)

    1.Android中的五种布局方式:线性布局(Linear Layout).相对布局(Relative Layout).表格布局(Table Layout).网格视图(Grid View).标签布局( ...

  10. Hdu-4757 Tree(可持久化字典树+lca)

    题目链接:点这 我的github地址:点这     Problem Description   Zero and One are good friends who always have fun wi ...