mapred-site.xml文件中:
mapred.task.timeout
600000
The number of milliseconds before a task will be
terminated if it neither reads an input, writes an output, nor
updates its status string.
该参数默认为60000毫秒(即600秒)。这意味着,如果map或reduce方法在600秒内没有返回或者输出内容,TaskTracker将认为相应的map或reduce已经死亡。
并向JobTracker汇报错误。JobTracker会杀死此次尝试,并在其他节点上重新执行它。
对于长时间运行的任务对此有两种解决方法:
1.增加配置文件中的值,但此种方法需要预先知道任务的运行时长
2.通过代码:无须知道任务的运行时长:
public class H eartbeat extends Thread{
private static final int sleepTime = 400;
private boolean beating = true;
private TaskInputOutputContext context = null;
private H eartbeat (TaskInputOutputContext context){
this.context = context;
}
@Override
public void run(){
while(beating){
try{
Thread.sleep(sleepTime * 1000);
}catch(InterruptedException e){}
context.setStatus(Long.valueOf(System.currentTimeMillis()).toString());
}
}
public void stopbeating(){
beating = false;
}
public static Heartbeat createHeartbeat(TaskInputOutputContext context){
Heartbeat heartbeat = new Heartbeat(context);
Thread heartbeatThread = new Thread(heartbeat);
heartbeatThread.setPriority(MAX_PRIORITY);
heartbeatThread.SetDaemon(true);
heartbeatThread.start();
return heatbeat;
}
}
Heartbeat类中的createHeartbeat方法创建一个新的线程,每隔sleepTime秒写入一次上下文,一定要讲该线程设置为最高优先级,使得它能够中断MR的执行。
同时确保他是一个守护线程,这样的话如果需要杀死MR的执行,Hadoop就可以自动杀死它。
应该在mapper/reducer的setup方法中调用createHearbeat方法。并在cleanup方法中调用stopbeating方法。
mapred.task.timeout
600000
The number of milliseconds before a task will be
terminated if it neither reads an input, writes an output, nor
updates its status string.
该参数默认为60000毫秒(即600秒)。这意味着,如果map或reduce方法在600秒内没有返回或者输出内容,TaskTracker将认为相应的map或reduce已经死亡。
并向JobTracker汇报错误。JobTracker会杀死此次尝试,并在其他节点上重新执行它。
对于长时间运行的任务对此有两种解决方法:
1.增加配置文件中的值,但此种方法需要预先知道任务的运行时长
2.通过代码:无须知道任务的运行时长:
public class H eartbeat extends Thread{
private static final int sleepTime = 400;
private boolean beating = true;
private TaskInputOutputContext context = null;
private H eartbeat (TaskInputOutputContext context){
this.context = context;
}
@Override
public void run(){
while(beating){
try{
Thread.sleep(sleepTime * 1000);
}catch(InterruptedException e){}
context.setStatus(Long.valueOf(System.currentTimeMillis()).toString());
}
}
public void stopbeating(){
beating = false;
}
public static Heartbeat createHeartbeat(TaskInputOutputContext context){
Heartbeat heartbeat = new Heartbeat(context);
Thread heartbeatThread = new Thread(heartbeat);
heartbeatThread.setPriority(MAX_PRIORITY);
heartbeatThread.SetDaemon(true);
heartbeatThread.start();
return heatbeat;
}
}
Heartbeat类中的createHeartbeat方法创建一个新的线程,每隔sleepTime秒写入一次上下文,一定要讲该线程设置为最高优先级,使得它能够中断MR的执行。
同时确保他是一个守护线程,这样的话如果需要杀死MR的执行,Hadoop就可以自动杀死它。
应该在mapper/reducer的setup方法中调用createHearbeat方法。并在cleanup方法中调用stopbeating方法。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29754888/viewspace-1250634/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29754888/viewspace-1250634/