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

Hadoop 如何在映射器(或减速机)中中止MR作业,hadoop,mapreduce,Hadoop,Mapreduce,我试图在map方法中抛出IOExceptions,但是MR作业没有停止。在抛出大量IOException后,作业将停止。 是否有任何方法可以通过抛出异常或一些简单的调用来停止整个作业? 谢谢。这不是Hadoop的理想用例,也不是一个好的实践,但您可以从代码内部终止您的工作。 所以,无论何时,当你达到想要停止工作的状态时,记录需要的内容并终止你的工作 这可以通过使用旧的mapredAPI运行Job.killjob()或使用Job.killjob()来完成。您应该分别在configure()或set

我试图在map方法中抛出IOExceptions,但是MR作业没有停止。在抛出大量IOException后,作业将停止。 是否有任何方法可以通过抛出异常或一些简单的调用来停止整个作业?
谢谢。

这不是Hadoop的理想用例,也不是一个好的实践,但您可以从代码内部终止您的工作。 所以,无论何时,当你达到想要停止工作的状态时,记录需要的内容并终止你的工作

这可以通过使用旧的
mapred
API运行Job.killjob()或使用
Job.killjob()
来完成。您应该分别在
configure()
setup()
中获得作业ID的
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();
...
}
}
}
类映射扩展映射器{
我的工作;
@凌驾
设置(){
//拿到工作证
//获取作业对象
}
地图(){
...
如果(停止条件){
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;
                }
            }
        }
    }
公共静态类LineMapper扩展Mapper{
布尔条件;
@凌驾
公共无效设置(上下文){
myCondition=true;
}
公共void映射(对象键、文本值、上下文上下文)引发IOException、InterruptedException{
//代码中发生了一些情况,您将条件更改为false以停止映射程序
真菌病=假;
}
@凌驾
公共void运行(上下文上下文)引发IOException、InterruptedException{
设置(上下文);
while(context.nextKeyValue()){
如果(线路计数器<50){
映射(context.getCurrentKey(),context.getCurrentValue(),context);
}否则{
清理(上下文);
打破
}
}
}
}

在新的API中,我们如何从org.apache.hadoop.mapreduce.JobID获取org.apache.hadoop.mapreduce.Job的实例?