MapReduce的工作机制(四)

MapReduce之部分源码分析

主要对部分重要函数源码进行分析。

OutputCommitters

MapReduce使用一个提交协议确保作业和任务都完全成功或者失败。这个行为通过OutputCommitters实现。
OutputCommitters的源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public abstract class OutputCommitter {
public abstract void setupJob(JobContext jobContext) throws IOException;

@Deprecated
public void cleanupJob(JobContext jobContext) throws IOException {}

public void commitJob(JobContext jobContext) throws IOException {
cleanupJob(jobContext);
}


public void abortJob(JobContext jobContext, JobStatus.State state) throws IOException {
cleanupJob(jobContext);
}

public abstract void setupTask(TaskAttemptContext taskContext) throws IOException;

public abstract boolean needsTaskCommit(TaskAttemptContext taskContext) throws IOException;

public abstract void commitTask(TaskAttemptContext taskContext) throws IOException;

public abstract void abortTask(TaskAttemptContext taskContext) throws IOException;

@Deprecated
public boolean isRecoverySupported() {
return false;
}

public boolean isRecoverySupported(JobContext jobContext) throws IOException {
return isRecoverySupported();
}

public void recoverTask(TaskAttemptContext taskContext) throws IOException {}
}

  • setupJob()方法在作业运行前调用,通常用来执行初始化操作。
  • 如果作业成功,就调用commitJob()方法,在默认的基于文件的实现中,它用于删除临时的工作空间并在输出目录中创建一个名为_SUCCESS的隐藏的标志文件,以此告知文件系统的客户端该作业完成。
  • 如果作业不成功,就通过状态对象调用abortJob(),以为这该作业是否失败或终止。在默认的实现中,将删除作业的临时工作空间。
  • 任务级别上。在任务执行之前先调用setupTask()方法,默认实现不做任何事情。因为针对任务输出命名的临时目录在写任务输出的时候被创建。
  • 任务的提交阶段是可选的,并通过从needsTaskCommit()返回的false值关闭它。这使得执行框架不必为任务运行分布提交协议,也不需要CommitTask()或者abortTask()
  • 如果任务成功,就调用commitTask(),在默认的实现中它将临时的任务输出目录移动到最后的输出路径。否则,执行框架调用abortTask(),它负责删除临时的任务输出目录。
  • 执行框架保证特定任务在有多次任务尝试的情况下,只有一个任务会被提交,其他的则被取消。