如何在映射器(或减速器)中中止MR作业

时间:2013-09-25 07:11:03

标签: hadoop mapreduce

我尝试在map方法中抛出IOExceptions,但MR作业未停止。抛出大量IOException后,作业将停止。 有没有办法通过抛出异常或一些简单的调用来阻止整个工作? 感谢。

2 个答案:

答案 0 :(得分:2)

这不是Hadoop的理想用例,也不是一个好的做法,但你可以直接从代码中删除你的工作。 因此,每当你达到你希望你的工作停止的状态时,记录需要并杀死你的工作。

这可以使用旧的mapred API或Job.killJob()来完成RunningJob.killjob()。您应该分别在RunningJobJob中引用jobID的configure()setup()个对象。然后在需要时调用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();
...
}
}
}

答案 1 :(得分:0)

您可以通过简单地覆盖Mapper的设置和运行功能来跳过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;
                }
            }
        }
    }