hadoop–JobTracker 相关
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的容错
从作业的恢复粒度,当前存在三种不同级别的恢复机制,按照级别从低到高依次为
- 作业级别: 将作业分成挖成的未完成的。对未完成的作业全部重新执行(包括作业中已经完成的Task)。
- 任务级别:将任务分为完成的任务和未完成的任务。仅对未完成的任务重新执行。
- 记录级别:仅对Task中未处理的记录重新执行。(学术研究中)
级别越低实现越简单,但是资源的浪费越严重。目前简化设计考虑,采用的是作业级别的恢复机制。
任务推测执行
为解决部分作业慢拖后腿的问题,提出了任务推测执行机制。为拖后的任务启动一个备份任务。该任务和原始任务同时处理同一份数据,最终选用先成功运行完成的任务的计算结果作为最终的结果。
该问题出现的原因为Hadoop设计上的假设
- 每个节点的计算能力是一样的
- 任务的执行进度随时间线性增加
- 启动一个备份任务的代价可以忽略不计
- 一个任务的进度可以表示成已完成工作量占总工作量的比例。
- 同一个作业的同种类型的任务的工作量是一样的。所用时间也相同。
实际情况是复杂的,由于集群异构或者负载不均衡,就会产生问题。
hadoop 1.0.0的算法
一个任务同时满足以下添加,就会为该任务启动一个备份任务:
- 该任务尚未进入skip mode(由于推测执行机制和跳过坏记录机制均会拖慢任务执行进度,考虑到性能问题,不会同时启用这两个功能)
- 该任务没有其他正在运行的备份任务(当前Hadoop最多允许一个任务同时启动两个Task Attempt)
- 该任务已经运行时间超过60 s,并且当前正在运行的Task Attempt落后(通作业内所有TaskAttempt)平均进度的20%。
当任务的某个Task Attempt成功运行后,JobTracker会杀掉另外一个Task Attempt
上面算法的问题是:
- 20% 空间问题。即当作业内大部分任务已经完成,而若干个Task Attempt的进度已经大于等于80%,则永远不会触发启动备份任务。
- 缺乏保证备份任务执行速度的机制:新启动的备份任务需要首先处理原始Task Attempt已经处理完的数据,因此需要保证备份任务的运行速度不低于原始Task Attempt,否则就没有必要启动备份任务。
- 参数不可配置: 即设定的20%% 和60s都是不可配置的。不能满足用户根据自己集群特点定制参数的要求
0.21.0版本的算法
配置选项
- mapreduce.job.speculative.slownodethreshold : 任意一个TaskTracker 已完成任务的平均进度增长率和所有已完成任务的平均进度增长率的最大允许差距。 默认为1. 超过阈值时标明该TaskTracker的性能比较低,不会在其上启动一个备份任务。
- mapreduce.job.speculative.slowtaskthreshold: 作业的任意一个任务的平均进度增长率与所有正在运行任务的平均进度增长率的最大允许差距。默认为1.超过阈值标明该任务运行过慢,需要启动一个备份任务。
- mapreduce.job.speculative.speculativecap: 限定作业允许启动备份任务的任务数目占正在运行任务的百分比。默认为0.1,即为一个作业启动推测执行功能的任务数不能超过过正在运行任务的10%
启动备份任务
- 判断Task Tracker X是否是一个慢Task Tracker,如果是,则不能启动任何备份任务
- 检查作业J 是否启动的备份任务数超过限制。
- 筛选出作业J总满足调价的任务保存在数据candidates中
- 该任务未在TaskTracker X上运行失败过。
- 该任务没有其他正在运行的备份任务
- 该任务以运行时间超过60s
- 该任务已经出现拖后腿现象。
- 按照运行剩余时间从大到小对candidates中的任务派讯,选择剩余时间最大的任务为其启动备份任务。
该算法的缺点是:
- 任务进度和剩余时间估算不准确,导致部分正常任务被误认为是拖后腿,从而造成资源浪费
- 未针对任务类型节点分类: 即需要对Map Task和Reduce Task区分,对于Map Task是慢节点的,对Reduce Task也许是快节点。
2.0 版本的算法
重点关注备份任务是否有潜力比当前正在运行的任务完成的更早。
调度策略
- 针对Map Task 考虑数据本地性
- Map task选择策略
- 优先选择运行失败的任务
- 其次是尚未运行的任务
- 最后是正在运行的任务,为拖后腿的任务启动备份任务
- Reduce Task 选择策略 从未运行的任务列表中选择第一个满足条件的任务。
hadoop–JobTracker 相关的更多相关文章
- hadoop以及相关组件介绍以及个人理解
前言 本人是由java后端转型大数据方向,目前也有近一年半时间了,不过我平时的开发平台是阿里云的Maxcompute,通过这么长时间的开发,对数据仓库也有了一定的理解,ETL这些经验还算比较丰富.但是 ...
- Hadoop及其相关组件简介
一.大数据介绍 1.大数据指的是所涉及的数据量规模巨大到无法通过人工,在合理时间内达到截取.管理.处理.并整理成为人类所能解读的形式的信息. 2.大数据,可帮助我们能察觉商业趋势.判断研究质量.避免疾 ...
- 通过Hadoop jmx收集Namenode,Jobtracker相关信息
经常会有一些Hadoop监控的需求,例如datanode节点掉线,Tasktracker blacklist的数量,以及Namenode,Jobtracker的内存GC信息等. 之前采用Hadoop ...
- Hadoop开发相关问题
总结自己在Hadoop开发中遇到的问题,主要在mapreduce代码执行方面.大部分来自日常代码执行错误的解决方法,还有一些是对Java.Hadoop剖析.对于问题,通过查询stackoverflow ...
- hadoop data 相关开源项目(近期学习计划)
计划学习几个hadoop相关的开源项目: 1.spring hadoop 2.spring batch 3.spring redis 4.spring mongo 相关项目样例:https://git ...
- Hadoop JobTracker和NameNode运行时参数查看
1)JobTracker运行时参数: hadoop@ubuntu:/home/zhangchao3$ ps -ef | grep job hadoop 29563 1 0 11:34 pts/12 ...
- Hadoop–TaskTracker 相关
TaskTracker 是Hadoop集群中运行于各个节点上的服务.他是JobTracker和Task之间的"通信桥梁".一方面它从JobTracker端接受并执行各种命令:比如运 ...
- Hadoop 中文编码相关问题 -- mapreduce程序处理GBK编码数据并输出GBK编码数据(转)
hadoop的hdfs文件系统中,默认的是utf-8, 故你上传的文件是要设置成utf-8.当输入的是gbk,有该如何? 输入是GBK文件, 输出也是 GBK 文件的示例代码: Hadoop处理GBK ...
- hadoop的相关资料链接
hadoop的资料整理博客 http://www.itpub.net/thread-1588509-1-1.html
随机推荐
- python之序列去重以及生成器、生成器函数、生成器表达式与迭代器浅谈
首先要明确序列值类型是否可哈希,因为可哈希的值很简单就可以用 in /not in 写个生成器去判断,如果是不可哈希的就要去转换为可哈希的再用 in/not in 去判断 原地不可变类型(可哈希): ...
- MyBatis笔记一:GettingStart
MyBatis笔记一:GettingStart 1.MyBatis优点 我们的工具和各种框架的作用就是为了我们操作数据库简洁,对于一些数据库的工具能帮我们少写一些处理异常等等的代码,但是他们并不是自动 ...
- update 后没有加where条件解决办法
MySQL 误操作后数据恢复(update,delete忘加where条件) 在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操 ...
- JavaScript代码/ES6语法笔记一
1. new Set()/去重一个数组 let arr = [1, 2, 2, 3, 3]; let set = new Set(arr); let newArr = Array.from(set); ...
- 前端学习(二十)jquery属性(笔记)
jq里面操作属性的方法: 设置属性: 设置一个: $(this).attr('src','img/pic2.jpg'); 设置一组: ...
- mac MAMP安装redis扩展
一般情况下目录大概是一样的,只是php的版本不同,所以选择好自己对应的php版本目录即可 git clone https://github.com/nicolasff/phpredis.git cd ...
- k8s集群搭建之一:基础环境
一按照kubernetes对软件和硬件的要求: 二准备的主机系统以及ip配置 角色 系统 IP k8s-master centos7.4 192.168.137.66 k8s-node1 centos ...
- CentOS7.6 部署asp.net core2.2 应用
1.安装.net Core SDK 在安装.NET之前,您需要注册Microsoft密钥,注册产品存储库并安装所需的依赖项.这只需要每台机器完成一次. 打开终端并运行以下命令: sudo rpm -U ...
- Java类的成员之四:代码块.
3.2类的成员之四:代码块 ①初始化块(代码块)作用:对Java对象进行初始化 ②程序的执行顺序: ③一个类中初始化块若有修饰符,则只能被static修饰,称为静态代码块(static block ) ...
- sql 性能优化 索引碎片
1.索引 简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以大大提高数据库查询的效率.(1). 优点大大加快了数据库检索的速度,包 ...