Hadoop中任务推测执行

版权声明:有一种生活不去经历不知其中艰辛,有一种艰辛不去体会,不会知道其中快乐,有一种快乐,没有拥有不知其中纯粹 https://blog.csdn.net/wwwzydcom/article/details/83903496
  1. 作业完成时间取决于最慢的任务完成时间
    一个作业由若干Map任务和Reduce任务构成,但因硬件老化,软件BUG,某些任务可能运行非常慢
    典型案例:系统中有 99%的 Map 任务都完成了,只有少数几个 Map 老是进度很慢,完不成,怎么办?

  2. 推测执行机制
    发现拖后腿的任务,比如某个任务运行速度远慢于任务平均速度,为拖后腿任务启动一个备份任务,同时运行,谁先运行完,就用谁的结果

  3. 执行推测任务的前提条件

    (1) 每个task只能一个备份任务
    (2)当前job已完成的task必须不小于5%
    (3)开始推测执行参数设置 修改mapred-site.xml 默认是打开的

     <property>
     <name>mapreduce.map.speculative</name>
     <value>true</value>
     <description>If  true,  then  multiple  instances  of  some  map  tasks
     may be executed in parallel.</description>
     </property>
    
     <property>
     <name>mapreduce.reduce.speculative</name>
     <value>true</value>
     <description>If true, then multiple instances of some reduce tasks
     may be executed in parallel.</description>
     </property>
    
  4. 不能启用推测执行机制情况

    (1) 任务间存在严重的负载倾斜 比如两个节点 第一个节点跑90%的任务,第二个节点跑的少
    (2)特殊任务,比如任务向数据库中写数据

  5. 算法原理

    假设某一个时刻,任务T的执行进度为process,可以通过一定的算法推测出该任务的最终完成时刻, estimateEndTime,另一方面,如果此刻为该任务启动一个备份任务,则可以推断出它可能完成时刻,estimateEndTime,则可以退出公式

     estimateEndTime = estimatedRunTime + taskStartTime
     推测执行完时刻 60 = 推测运行时间(60s) + 任务启动时刻(0)
    
     estimatedRunTime = (currentTimestamp - taskStartTime) / progress
     推测运行时间(60s) =(当前时刻(6) - 任务启动时刻(0)) / 任务运行比例(10%)
     
     estimateEndTime` = currentTimestamp + averageRunTime
     备份任务推测完成时刻(16) = 当前时刻(6) + 运行完成任务的平均时间(10s)
    
    1. MR总是选择(estimateEndTime- estimateEndTime ` )差值最大的任务,并为之启动备份任务。
    2. 为了防止大量任务同时启动备份任务造成的资源浪费,MR为每个作业设置了同时启动的备份任务数目上限。
    3. 推测执行机制实际上采用了经典的优化算法:以空间换时间,它同时启动多个相同任务处理相同的数据,并让这些任务竞争以缩短数据处理时间。显然,这种方法需要占用更多的计算资源。在集群资源紧缺的情况下,应合理使用该机制,争取在多用少量资源的情况下,减少作业的计算时间。

猜你喜欢

转载自blog.csdn.net/wwwzydcom/article/details/83903496