退出MapReduce程序

经常在MapReduce程序中,看到这样的一句话
System.exit(job.waitForCompletion( true) ? 0 : 1)

包括两部分:

一个是System.exit( doSomeThing ? 0 : 1)
另一个是job.waitForCompletion( true)

先说System.exit( 参数 )

这里的参数,可以是0,也可以是1.

如果是0,表示程序正常退出;如果是非零值,则表示程序非正常退出。
所以System.exit会等待job.waitForCompletion的返回值,然后退出程序。

再来看job.waitForCompletion(参数)

方法的代码实现

public boolean waitForCompletion(boolean verbose) throws IOException, InterruptedException, ClassNotFoundException {
    if (this.state == Job.JobState.DEFINE) {
        this.submit();
    }

    if (verbose) {
        this.monitorAndPrintJob();
    } else {
        int completionPollIntervalMillis = getCompletionPollInterval(this.cluster.getConf());

        while(!this.isComplete()) {
            try {
                Thread.sleep((long)completionPollIntervalMillis);
            } catch (InterruptedException var4) {
                ;
            }
        }
    }

    return this.isSuccessful();
}

代码解析:

if (this.state == Job.JobState.DEFINE) {
    this.submit();
}
MapReduce的job的状态,即Job.JobState有两种,一种是新创建,新定义,另一种是正在执行。
如果job是DEFINE状态,则submit提交代码。

下面代码:

if (verbose) {
    //如果传参verbose为true,则执行监控和打印job详细信息的操作。
    this.monitorAndPrintJob();
} else {
    int completionPollIntervalMillis = getCompletionPollInterval(this.cluster.getConf());
    //进入循环,持续监测job的状态,看job是否执行完毕
    while(!this.isComplete()) {
        try {
            Thread.sleep((long)completionPollIntervalMillis);
        } catch (InterruptedException var4) {
            ;
        }
    }
}

 

最后返回程序的执行结果状态
return this.isSuccessful();

 

这样一个mapreduce程序,就可以退出了。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注