欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

深入解析MapReduce架构设计与实现原理–读书笔记(3)OutputFormat

程序员文章站 2022-03-31 10:52:19
...

OutputFormat 接口的设计与实现 主要用于描述输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件中。 RecordWriter getRecordWriter(FileSystem ignored, JobConf job, String name, Progressable progress) throws IOException; void checkO

OutputFormat接口的设计与实现

主要用于描述输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件中。
RecordWriter getRecordWriter(FileSystem ignored, JobConf job,
String name, Progressable progress)
throws IOException;
void checkOutputSpecs(FileSystem ignored, JobConf job) throws IOException;

checkOutputSpecs方法在用户作业被提交到JobTracker之前,由JobClient自动调用,以检查输出目录的合法性。
getRecordWriter方法返回一个RecordWriter类对象。该类中的方法write接收一个key/value对,并将之写入文件。
在Task执行过程中,MR框架会将map()或者reduce()函数产生的结果传入write方法。
示例:

public void map(Text key,Text value,OutputCollector output,Reporter reporter) throws IOException{........output.collect(newKey,newValue);}函数output.collect(newKey,newValue)内部实现:RecordWriter out = job.getOutputFormat().getRecorderWriter(..);out.write(newKey,newValue);

OutputFormat
包括DBOutputFormat,FileOutputFormat,EmptyOutputFormat
FileOutputFormat
包括MultipleOutputFormat,MapFileOutputFormat,SquenceFileOutputFormat,TextOutputFormat
MultipleOutputFormat
包括MultipleSequenceOutputFormat,MultipleTextOutputFormat

FileOutputFormat主要功能

实现checkOutputSpecs接口

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

处理side-effect file

任务的side-effect file并不是任务的最终输出文件,而是具有特殊用途的任务专属文件。作用执行推测式任务
在hadoop中,因为硬件老化,网络故障等原因,同一个作业的某些任务执行速度可能明显慢于其他任务,这种任务会拖慢整个作业的执行速度,为了对这种
慢任务进行优化,hadoop会为之在另外一个节点上启动一个相应的任务,该任务为推测式任务,最先完成任务的计算结果便是这块数据对应的处理结果。为
防止这两个任务同时往一个输出巍峨见中写入数据时发生写冲突,FileOutputFormat会为每个Task的数据建立一个side-effect file,并将产生的数据临时
写入该文件,待Task执行完成后,再移动到输出目录。

OutputCommitter

这些文件的相关操作,由OutputCommitter 完成。Hadoop提供了对该接口的默认实现。FileOutputCommitter,用户可以根据自己的需求编写OutputCommitter,
并通过参数{mapred.output.committer.class}指定。
FileOutputCommitter接口定义及FileOutputCommitter对应的实现
setupJob 作业初始化 创建临时目录${mapred.out.dir}/_temporary
commitJob 作业成功运完成 删除临时目录,并在${mapred.out.dir}目录下创建空文件_SUCCESS
abortJob 作业运行失败 删除临时目录
setupTask 任务初始化 不进行任何操作
neddsTaskCommit 判断是否需要提交结果 只要存在side-effect file,就返回true
commitTask 任务成功运行完成 提交结果,即将side-effect file移动到${mapred.out.dir}目录下
abortTask 任务运行失败 删除任务的side-effect file
默认情况下,当作业成功完成后,会在最终结果目录${mapred.out.dir}下生成空文件_SUCCESS。该文件主要为高层应用提供作业运行完成的标识,Oozie需要
通过检测结果目录下是否存在该文件判断作业是否运行完成。