Hadoop MapReduce中的OutputCommitter
在Hadoop框架中,发生分布式处理,其中在不同节点上生成map和reduce任务并处理部分数据。在这种类型的分布式处理中,重要的是要确保框架知道何时特定任务完成或者需要中止该任务以及何时整体完成该任务。为此,与许多其他分布式系统一样,Hadoop也使用提交协议。在Hadoop中实现它的类是OutputCommitter。
Hadoop中的OutputCommitter类描述了Map-Reduce作业的任务输出的提交。在Hadoop 2中,可以使用OutputFormat类的getOutputCommitter()方法设置OutputCommitter实现。 FileOutputCommitter是默认的OutputCommitter。请注意,OutputCommitter是Hadoop框架中的抽象类,可以对其进行扩展以提供OutputCommitter实现。
OutputCommitter在Hadoop Map-Reduce中执行的任务
1-在初始化期间设置作业。例如,在作业初始化期间为该作业创建临时输出目录。为此,使用setupJob()方法。对于整个作业,这是从应用程序主过程调用的。这将被多次调用,每次尝试一次。
2在作业完成后清理作业。例如,在作业完成后删除临时输出目录。
当调用commitJob()或者abortJob()方法时,将完成清理。
对于最终运行状态为SUCCESSFUL的作业,将调用commitJob()方法。对于整个作业,这是从应用程序主过程调用的。保证只调用一次此方法即可保持原子性。
对于最终运行状态为JobStatus.State.FAILED或者JobStatus.State.KILLED的作业,调用abortJob()方法。对于整个作业,这是从应用程序主过程调用的。这可能被多次调用。
3设置任务临时输出。这是通过调用setupTask()方法完成的。从将输出到HDFS的每个任务的过程中调用此方法,并且仅针对该任务调用该方法。对于同一任务,但是对于不同的任务尝试,可以多次调用该命令。
4检查任务是否需要提交。如果任务不需要提交,这将避免提交过程。
使用needsTaskCommit()方法检查任务是否需要提交。此方法返回false表示已禁用任务的提交阶段。
5提交任务输出。在此步骤中,任务的临时输出会升级到最终输出位置。
使用的方法是commitTask()。同一任务可能有多个任务尝试,Hadoop框架确保失败的任务尝试被中止并且仅提交一个任务。
6丢弃任务提交。如果任务未完成,则调用abortTask()方法。对于同一任务,但是对于不同的任务尝试,可以多次调用此方法。