我试图在映射方法中抛出IOExceptions,但MR作业没有停止。在抛出大量IOException后,该作业将停止。有没有办法通过抛出异常或一些简单的调用来停止整个作业?谢谢。
这不是Hadoop的理想用例,也不是一个好的做法,但你可以直接从代码内部终止你的工作。因此,每当您达到希望工作停止的条件时,请记录所需的工作并杀死您的工作。
这可以使用旧的 mapred
API 或使用 Job.killJob()
来完成 RunningJob.killjob() 来完成。您应该分别以 configure()
或 setup()
格式获取对 jobID 的RunningJob
或Job
对象的引用。然后在需要时调用 kill 作业,新 API 的伪代码如下所示:
Class Map extends mapper<K1,V1,K2,V2>{
Job myJob;
@Override
setup(){
// Get the JObID
// Get the Job object
}
map(){
...
if(condition-to-stop){
myJob.killJob();
...
}
}
}
您可以通过简单地重写映射器的设置和运行函数来跳过 getJobID 方法。
public static class LineMapper extends Mapper<Object, Text, Text, Text>{
boolean myCondition;
@Override
public void setup(Context context){
myCondition = true;
}
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
//something happens in your code and you change the condition to false to stop the mapper
myCondition = false;
}
@Override
public void run(Context context) throws IOException, InterruptedException {
setup(context);
while (context.nextKeyValue()) {
if(linecounter < 50) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
} else {
cleanup(context);
break;
}
}
}
}