mapreduce任务失败、重试、推测式执行机制小结

mapreduce中我们自定义的mapper和reducer程序在执行后有可能遇上出错退出的情况,mapreduce中jobtracker会全程追踪任务的执行情况,对于出错的任务mapreduce也定义了一套自己的处理方式。

首先要明确的是mapreduce判断任务失败的方式。三种情况下任务会被认为执行失败:返回非0值、产生java异常、超时(长时间没响应)。对于第一种,通常用于streaming程序。如果你的mapper或reducer程序结束的时候返回了非0值,那么mapreduce会认为你的任务失败了。第二种主要用于java写的mapreduce程序。对于第三种,估计很多人都不知道。对于streaming,mapreduce在任务执行后会监测任务的输出(标准输出),如果任务在一定时间内无输出(这个时间可以通过mapred.task.timeout选项设定),则mapreduce会认为这个任务失败。因此写mapreduce程序的时候一定要留意程序是否会发生超时间假死的情况,如果有这种情况那就要考虑下程序会不会被误杀。

在任务失败后,mapreduce会重新执行任务,重试的次数也是可以设定的,一般是4次。

最后还要注意的是mapreduce还有一个推测式执行机制,在这个机制下如果任务执行时间超出预期(这个预期是根据其他任务的执行时间定的),那么mapreduce会另外启动一个跟这个任务相同的任务并行执行,在某个任务最先执行完成之后杀死其他尚未完成的任务。这个机制主要是用来避免某个reduce任务的执行环境有问题或者某个reduce任务执行中发生了反常情况而迟迟不能完成拖慢整体进度。但是这个机制在有些情况下也会造成问题,例如:如果你的reduce程序在相同输入并发执行的情况下会造成冲突,那么推测式执行机制对你来说就是个极大的隐患。不过好在推测式执行机制也是可以关闭的。

mapreduce任务失败、重试、推测式执行机制小结

时间: 2024-10-10 00:21:27

mapreduce任务失败、重试、推测式执行机制小结的相关文章

mapreduce任务失败、重试、猜測式运行机制小结

mapreduce中我们自己定义的mapper和reducer程序在运行后有可能遇上出错退出的情况,mapreduce中jobtracker会全程追踪任务的运行情况,对于出错的任务mapreduce也定义了一套自己的处理方式. 首先要明白的是mapreduce推断任务失败的方式.三种情况下任务会被觉得运行失败:返回非0值.产生java异常.超时(长时间没响应).对于第一种,通经常使用于streaming程序.假设你的mapper或reducer程序结束的时候返回了非0值,那么mapreduce会

Hadoop学习19--推测式执行

所谓推测式执行,就是计算框架判断,如果有一个task执行的过慢,则会启动备份任务,最终使用原任务+备份任务中执行较快task的结果.产生原因一般是程序bug.负载倾斜. 那么这个较慢,是怎么判断的呢? 有如下具体的算法: 比较两个时间.一是根据推测式算法计算出来的task最终完成时刻,也就是按着任务当前的运行速度,推测出来的时刻.暂且命名为oldtime 二是如果此刻启动该任务,则推测出来将要完成的时刻,这个是按着已运行完的任务推测出来的时刻.暂且命名为newtime 如果newtime的时间点

Hadoop2.6.0运行mapreduce之推断(speculative)执行(一)

前言 当一个应用向YARN集群提交作业后,此作业的多个任务由于负载不均衡.资源分布不均等原因都会导致各个任务运行完成的时间不一致,甚至会出现一个任务明显慢于同一作业的其它任务的情况.如果对这种情况不加优化,最慢的任务最终会拖慢整个作业的整体执行进度.好在mapreduce框架提供了任务推断执行机制,当有必要时就启动一个备份任务.最终会采用备份任务和原任务中率先执行完的结果作为最终结果. 由于具体分析推断执行机制,篇幅很长,所以我会分成几篇内容陆续介绍. 推断执行测试 本文在我自己搭建的集群(集群

坦言spring中事务、重试、异步执行注解

一.@Transaction 我们再编码过程中,大量使用到这个注解.一般情况下,@Transaction使用默认注解可以完成90%的功能,下面会针对一些特殊场景下,@Tansaction的使用注意 1.1 事务回滚 @Transactional() public void rollback() throws SQLException { ... //do something throw new SQLException("exeception"); } 上述代码会回滚吗,答案是不会的.

【Spark Core】任务执行机制和Task源码浅析1

引言 上一小节<TaskScheduler源码与任务提交原理浅析2>介绍了Driver侧将Stage进行划分,根据Executor闲置情况分发任务,最终通过DriverActor向executorActor发送任务消息. 我们要了解Executor的执行机制首先要了解Executor在Driver侧的注册过程,这篇文章先了解一下Application和Executor的注册过程. 1. Task类及其相关 1.1 Task类 Spark将由Executor执行的Task分为ShuffleMap

【Spark Core】任务执行机制和Task源码浅析2

引言 上一小节<任务执行机制和Task源码浅析1>介绍了Executor的注册过程. 这一小节,我将从Executor端,就接收LaunchTask消息之后Executor的执行任务过程进行介绍. 1. Executor的launchTasks函数 DriverActor提交任务,发送LaunchTask指令给CoarseGrainedExecutorBackend,接收到指令之后,让它内部的executor来发起任务,即调用空闲的executor的launchTask函数. 下面是Coars

JS代码执行机制

JS代码从编译到执行 我们写出一段JS代码,JS的引擎并不是按照我们书写的顺序从上到下顺序编译并且执行的,首先是按照自己的规则对我们的代码先进行编译,然后从上到下执行编译的代码. 在全局作用域中,JS首先会对我们的函数进行声明,然后就是我们经常听到的变量提升机制,然后才是按照我们书写代码的顺序,来进行编译,然后在执行编译的代码. 看如下代码: function fn(){ console.log(a); } fn(); var a = "value"; 非常常见的一个面试题fn函数执行

C#隐式执行CMD命令

本文实现C#隐式执行CMD功能命令.下图是示例程序的主界面. 在命令文本框输入DOS命令,点击"Run"button.在以下的文本框中输出执行结果. 以下是程序的完整代码. 本程序没有使用p.StandardOutput.ReadtoEnd()和p.StandardOutput.ReadLine()方法来获得输出,由于这些方法运行后画面easy卡死. 而是通过调用异步方法BeginOutputReadLine来获取输出.并在事件p.OutputDataReceived的事件处理方法中来

linux上应用程序的执行机制

linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信息. 1.父进程的行为: 复制,等待 执行应用程序的方式有很多,从shell中执行是一种常见的情况.交互式shell是一个进 程(所有的进程都由pid号为1的init进程fork得到,关于这个话题涉及到Linux启动和初 始化,以及idle进程等,有空再说),当在用户在shell中敲入./test执行程序时,