整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

6.5.3. 关于 OutputCommitters

hadoop 小红牛 9℃ 0评论

Hadoop MapReduce使用一个提交协议来确保作业和任务都完全成功或失败。这个行为通过对作业使用OutputCommitter来实现,在老版本 MapReduce API中通过调用JobConfsetOutputCommitter()或配置中的mapred.output.committer.class来设置。在新版本的MapReduce API中,OutputCommitter OutputFormat 通过它的 getOutputCommitter()方法确定。默认值为FileOutputCommitter,这对基于文件的MapReduce是适合的。可以定制已有的OutputCommitter或者在需要对作业或任务进行特别的安排或清理时,甚至还可以写一个新的实现。

OutputCommitterAPI如下所示(在新旧版本中的MapReduce API中):

public abstract class OutputCommitter {
    public abstract void setupJob(JobContext jobContext) throws IOException;
    public void commitJob(JobContext jobContext) throws IOException { }
    public void abortJob(JobContext jobContext, DobStatus.State state) throws IOException { }
    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;

setupJob()方法在作业运行前被调用,通常用来执行初始化操作。 FileOutputCommitter()方法通常为任务创建最后的输出目录${mapred.output.dir}以及一个临时的工作空间${mapred. outpur. dir}/ _temporary

如果作业成功,就调用commitJob()方法,在默认的基于文件的实现中,它用于删除临时的工作空间并在输出目录中创建一个名为_SUCCESS的隐藏的标志文件,以此告知文件系统的客户端该作业成功完成了。如果作业不成功,就通过状态对象调用abortJob(),意味着该作业是否失败或终止(例如由用户终止)。在默认的实现中,将删除作业的临时工作空间。

在任务级别上的操作与此类似。在任务执行之前先调用setupTask()方法,默认的实现不做任何事情,因为针对任务输出命名的临时目录是在写任务输出的时候被创建。

任务的提交阶段是可选的,并通过从needsTaskCornmit()返回的false值关闭它。这使得执行框架不必为任务运行分布提交协议,也不需要commitTask()或者abortTask()

当一个任务没有写任何输出时,FileOutputCommitter将跳过提交阶段。

如果任务成功,就调用commitTask(),在默认的实现中它将临时的任务输出目录(它的名字中有任务尝试的ID,以此避免任务尝试间的冲突)移动到最后的输出路径${mapred.output.dir}。否则,执行框架调用abortTask(),它负责删除临时的任务输出目录。

执行框架保证特定任务在有多次任务尝试的情况下只有一个任务会被提交,其他的则被取消。这种情况是可能出现的,因为第一次尝试出于某个原因而失败(这种情况下将被取消),提交的是稍后成功的尝试。另一种情况是如果两个任务尝试作为推测副本同时运行,则提交先完成的,而另一个被取消。

 

任务附属文件

对于map任务和reduce任务的输出,常用的写方式是通过 OutputCollector来收集键/值对。有一些应用需要比单个键/值对模式更灵活的方式,因此直接将mapreduce任务的输出文件写到分布式文件系统,如HDFS。(还有其他方法用于产生多个输出)

注意,要确保同一个任务的多个实例不向同一个文件进行写操作。如前所述,OutputCommitter协议解决了该问题。如果应用程序将附属文件导入其任务的工作目录中,那么成功完成的这些任务就会将其附属文件自动推送到输出目录,而失败的任务,其附属文件则被删除。

任务通过从其配置文件査询mapred.work.output.dir属性值找到其工作目录。另一种方法,使用Java APIMapReduce程序可以调用FileOutputFormat 上的getWorkOutputPath()静态方法获取描述工作目录的Path对象。执行框架在执行任务之前首先创建工作目录,因此不需要我们创建。

举一个简单的例子,假设有一个程序用来转换图像文件的格式。一种实现方法是用一个只有map任务的作业,其中每个map指定一组要转换的图像 (可以使用NlinelnputFormat,详情参见6.4.3)。如果map任务把转换后的图像写到其工作目录,那么在任务成功完成之后,这些图像就会被传到输出目录。


转载请注明:全栈大数据 » 6.5.3. 关于 OutputCommitters

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址