知识学习——Hadoop OutputFormat

MapReduce工作流程

知识学习——Hadoop OutputFormat_第1张图片

OutputFormat类

OutputFormat和InputFormat类似,决定了在哪里以及怎样持久化Reduce作业的结果。

OutputFormat定义了三个方法

  • getRecordWriter(in context: TaskAttempContext)
  • checkOutputSpecs(in context: JobContext)
  • getOutputCommitter(in context: TaskAttempContext)

知识学习——Hadoop OutputFormat_第2张图片

OutputFormat类结构图

知识学习——Hadoop OutputFormat_第3张图片

RecordWriter类

RecordWriter类可以处理包含单个键值对的作业,并将结果写入到OutputFormat中准备好的位置。
RecordWriter的实现主要包括两个函数:

(1) write
write函数从Map/Reduce作业中取出键值对,并将其字节写入磁盘。

(2)close
close函数会关闭Hadoop到输出文件的数据流。

LineRecordWriter是默认使用的RecordWriter,它是TextOutputFormat的一部分。

它写入的内容包括:
(1) 键(key)的字节 (由getBytes()函数返回)
(2) 一个用以定界的制表符
(3) 值(value)的字节(由getBytes()函数返回)
(4) 一个换行符

基类FileOutputFormat类

基类FileOutputFormat需要提供所有基于文件的OutputFormat实现的公共功能,主要包括以下两个:

(1)实现checkOutputSpecs接口
该接口在作业运行之前被调用,默认功能是检查用户配置的输出目录是否存在,如果存在则抛出异常,以防止之前的数据被覆盖。

(2)处理side-effect file
任务的side-effect file并不是任务的最终输出文件,而是具有特殊用途的任务专属文件。它的典型应用是执行推测式任务。

在Hadoop中,同一个作业的某些任务执行速度可能明显慢于其他任务,进而拖慢整个作业的执行速度。为此,Hadoop会在另外一个节点上启动一个相同的任务,该任务便被称为推测式任务。

为防止这两个任务同时往一个输出文件中写入数据时发生写冲突,FileOutputFormat会为每个Task的数据创建一个side-effect file,并将产生的数据临时写入该文件,待Task完成后,再移动到最终输出目录中。

side-effect file的相关操作由OutputCommitter完成。它是一个接口, Hadoop提供了默认实现FileOutputCommitter,用户也可以根据自己的需求编写OutputCommitter实现,并通过参数{mapred.output.committer.class}指定。

OutputCommitter接口定义以及FileOutputCommitter对应的实现
知识学习——Hadoop OutputFormat_第4张图片

你可能感兴趣的:(Hadoop)