1. 背景

Speculative Task,又叫推测式任务,是指在分布式集群环境下,因为程序bug,负载不均衡或者资源分布不均,造成同一个job的多个task运行速度不一致,有的task运行速度明显慢于其他task(比如:一个job的某个task进度只有10%,而其他所有task已经运行完毕),则这些task拖慢了作业的整体执行进度,为了避免这种情况发生,Hadoop会为该task启动speculative task,让该speculative task与原始task同时运行,哪个先运行完,则使用它的结果。

Speculative Task思路是以空间换时间的,同时启动多个相同task,哪个完成的早,则采用哪个task的结果,这样明显可以提高任务计算速度,但是,这样却会占用更多的资源,在集群资源紧缺的情况下,合理的控制Speculative Task,可在多用少量资源情况下,减少大作业的计算时间。

本文主要介绍了Hadoop各个版本中Speculative Task设计思路,并指出了各自的不足及改进之处。

2. Hadoop 0.20.2和1.0.0中的算法

【算法流程】

如果一个task满足以下条件,则会为该task启动speculative task:

(1)该task还未启动任何speculative task(TaskInProgress仅对应一个running的task)

(2)在60s内落后(同一个作业所有task的)平均进度20%

某个Task可能对应多个正在运行的attempt task,任何一个运行结束,则会kill(不是fail)其他task。

【相关代码】

1
2
3
4
5
6
7
8
9
10
11
12
booleanhasSpeculativeTask(longcurrentTime, doubleaverageProgress) {
// these constants should be examined
// in more depth eventually...
//
  if(!skipping && activeTasks.size() <= MAX_TASK_EXECS &&
     (averageProgress - progress >= SPECULATIVE_GAP) &&
         (currentTime - startTime >= SPECULATIVE_LAG)
            && completes == 0&& !isOnlyCommitPending()) {
    returntrue;
  }
  returnfalse;
}

【存在问题】

以上算法可能造成以下几个问题:

(1) 作业的某个task被卡在87.7%处(MAPREDUCE-94)

(2) 当作业将要运行结束时,总不会启动speculative task

(3)  各个参数不可配置(SPECULATIVE_GAP,SPECULATIVE_LAG),不够灵活。

3. Hadoop 0.21.0中的算法

为了对Hadoop-0.20.2中的算法进行改进,Hadoop-0.21.0进行了以下优化:

(1) 添加了三个可配置选项

mapreduce.job.speculative.slownodethreshold,默认是1,用于判断某个TaskTracker是否适合启动某个task的speculative task

mapreduce.job.speculative.slowtaskthreshold,默认是1,用于判断某个task是否可以启动speculative task

mapreduce.job.speculative.speculativecap, 默认是0.1,用于限定某个job最多同时启动的spculative task的数目

(2) 限定条件

如果一个tasktracker/job/task满足以下条件,则会在该tasktracker上为该task启动一个speculative task:

(1)  Job已经启动的specutive task数目小于SpeculativeCap

(2) 该TaskTracker上该Job的所有task平均进度不小于SlowNodeThreshold,具体判断方法为:

tasktracker. mean-job.progessRate >job.std*job. SlowNodeThreshold

其中,tasktracker. Mean为该job在该tasktracker正在运行/已经运行完成的task的平均进度,job.progessRate为该作业的平均计算速度,job.std为该作业所有task计算速度的标准方差。

(3)  按照Task剩余时间,对Task进行排序

Task剩余时间定义为:(1-progress) / progressRate,其中process为task当前进度,progressRate为task的平均计算速度:progressRate= progress/deltaTime,其中deltaTime为该task启动以来所经历的时间

(4) 选择一个剩余时间最多,且 mean-progessRate >std*SlowTaskThreshold的task,并为该task启动speculative task,,其中mean为所有task平均计算速度,std为所有task计算速度的标准方差。

(3) 存在问题

(1)MAPREDUCE-2062

当一个作业只有一个task时,所有task的计算速度的标准方差为0,因而,总会为这样的作业启动speculative task

如果一个作业仅有一个task正在运行,则所有task的标准方差仍未0,Hadoop很可能为其他所有task启动speculative task。

(2)MAPREDUCE-3895

在Hadoop中,reduce task进度(对应上面的progress变量)计算很不合理,采用的方法是,将reduce task分为三个子过程:shuffle(copy),sort和reduce,各个阶段占进度的1/3,比如,一个task的shuffle阶段刚结束,它的进度应该是33.3%。 对于大部分作业,reduce task的进度变化并不是均匀的,一个task在某一时刻进度为33.3%,下一秒进度可能变为66.6%,这主要是因为sort阶段所做工作非常少,时间很短。也正是由于以上原因,reduce task很容易被误判速度过慢,进而启动speculative task。一种可行的解决方案是将sort阶段利用某个数学模型平滑处理。

4. 终极解决方案

拖后腿task出现的原因是系统负载不均衡和资源分配不均。尤其是在异构Hadoop集群中,拖后腿task会经常出现,而且最好不要打开speculative task功能,否则会出现大量的speculative task,造成严重的资源浪费,因为当前所有的speculative task解决方案均是假设集群是同构的。

为什么会造成这种问题?根本原因这种基于speculative task来解决拖后腿task是有问题的。拖后腿task最终应该通过调度器解决:每个TaskTracker通过heartbeat汇报自己机器上的资源分布情况和当前资源使用情况,比如CPU个数,CPU利用率,内存剩余量,IO负载等,然后由调度器根据当前资源使用情况,动态对任务进行调度(参考https://issues.apache.org/jira/browse/MAPREDUCE-1380),进而最大限度避免产生拖后腿task。

关于拖后腿task,还有一个需要解决的问题是,防止为某个task启动speculative task后,该task又变成拖后腿task,比如:某个node上所有task均往一个磁盘上写数据,且该磁盘负载很重,而此时又将一个speculative task调度到该节点上(也往该磁盘上写数据),此时,该speculative task变得缓慢,因而有人提出了Hadoop disk scheduler,具体参考:https://issues.apache.org/jira/browse/MAPREDUCE-2636

5. 关于Speculative Task的Hadoop代码

Hadoop中,关于推测式任务的相关代码均在文件JobInProgress.java和TaskInProgress.java中,JobInProgress.java主要函数定义如下:

1
2
3
protectedsynchronized TaskInProgress findSpeculativeTask(
  Collection<TaskInProgress> list, String taskTrackerName,
    String taskTrackerHost, TaskType taskType) {….}

TaskInProgress.java中主要函数定义如下:

1
booleancanBeSpeculated(longcurrentTime){…}

原创文章,转载请注明: 转载自董的博客

本文链接地址: http://dongxicheng.org/mapreduce/hadoop-speculative-task/

Hadoop推测执行(以空间换取时间)相关推荐

  1. 面试题--位操作---延伸到一个用空间换取时间效率的例子

    求下面函数的返回值(微软),假定x = 9999. int func(x) {     int countx = 0;     while(x)     {           countx ++; ...

  2. 空间换时间,查表法的经典例子

    前言 上一篇分享了:C语言精华知识:表驱动法编程实践 这一篇再分享一个查表法经典的例子. 我们怎么衡量一个函数/代码块/算法的优劣呢?这需要从多个角度看待.本篇笔记我们先不考虑代码可读性.规范性.可移 ...

  3. Hadoop之资源调度器与任务推测执行

    Hadoop之资源调度器 目录 资源调度器概述 先进先出调度器(FIFO) 容量调度器(Capacity Scheduler) 公平调度器(Fair Scheduler) 任务的推测执行 1. 资源调 ...

  4. 87-Spark推测执行spark.speculation

    1. 背景 hadoop的推测执行 推测执行(Speculative Execution)是指在分布式集群环境下,因为程序BUG,负载不均衡或者资源分布不均等原因,造成同一个job的多个task运行速 ...

  5. Forerunner:首个面向“多未来”的推测执行技术

    来源:微软研究院AI头条 编者按:10月26-29日,系统领域的全球顶会 SOSP 2021 在线上举办.在本届大会上,微软亚洲研究院研究员陈洋.郭众鑫.李润怀(实习生,浙江大学).陈硕.周礼栋.张宪 ...

  6. FPGA之道(62)时空变换之空间换时间

    文章目录 前言 时空变换之空间换时间 缓存提速使用 模块复制 同频模块复制 缓存降频复制 缓存降频使用 逻辑拆分 流水线 流水线的由来 如何在组合逻辑中使用流水线 如何在时序逻辑中使用流水线 顺序系统 ...

  7. Hadoop命令执行时提示JVM OOM问题的处理

    1.问题:执行Hadoop命令时提示java.lang.OutOfMemoryError: unable to create new native thread          就是OOM问题. 2 ...

  8. Oracle Study案例之--基于表空间的时间点恢复(TSPITR)

     Oracle Study案例之--基于表空间的时间点恢复(TSPITR) TSPITR(表空间时间点恢复)用于将一个或多个表空间恢复到过去某个时间点的状态,而其他表空间仍然保持现有状态. TSPIT ...

  9. [hashmap|空间换时间] leetcode 1 两数之和

    [hashmap|空间换时间] leetcode 1 两数之和 1.题目 题目链接 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下 ...

最新文章

  1. 三维植物树木模型 Maxtree – Plant Models Vol 74
  2. 阿里程序员推荐的15 款常用开发者工具
  3. 手机进水的正确处理方法?
  4. java两字符串是否相等_Java与JavaScript中判断两字符串是否相等的区别
  5. 技术贴:asp.net实现唯一账户在线 禁止同一帐号同时在线 asp.net实现您的帐号在别处登录,您已被迫下线!...
  6. JavaScript进阶3-学习笔记
  7. 插入脚注把脚注标注删掉_地狱司机不应该只是英国电影历史数据中的脚注,这说明了为什么...
  8. 关于用VS写C程序运行时出现烫字以及乱码的问题的原因
  9. K3Cloud开放数据模型
  10. linux安装到内存中,Linux安装识别大内存的补丁程序
  11. 粒子滤波与PF目标追踪
  12. opencv 2 归一化函数normalize详解
  13. latex 伪代码 return怎么写 不换行怎么办
  14. base64、File、Blob、ArrayBuffer互转
  15. 配置静态路由/下一跳知识
  16. GSYVideoPlayer禁用快进功能
  17. 基于Android的驾校预约管理系统
  18. python处理Excel表格--读取Excel表格
  19. 基于平台的软件开发(一)
  20. 怎样用万用表检测贴片三极管

热门文章

  1. 模拟赛-20190114-新魔法(distance)
  2. 详细解析WSAEventSelect模型
  3. VC树控件的简单使用
  4. Ubuntu 16.04 安装 ROS
  5. 美团--美团骑手包裹区间分组
  6. Python中的进程间通信
  7. 进程间程序替换和minishell
  8. Hadoop之ReduceTask工作机制
  9. 写代码之前应该做的几件事
  10. 谁动了我的工作效率?大咖分享融合通信背后的技术案例