时间:2021-07-01 10:21:17 帮助过:24人阅读
OutputFormat 接口的设计与实现 主要用于描述输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件中。 RecordWriter getRecordWriter(FileSystem ignored, JobConf job, String name, Progressable progress) throws IOException; void checkO
主要用于描述输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件中。
RecordWriter
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);
在作业运行之前被调用,默认功能是检查用户配置的输出目录是否存在,如果存在则抛出异常,以防止之前数据被覆盖。
任务的side-effect file并不是任务的最终输出文件,而是具有特殊用途的任务专属文件。作用执行推测式任务。
在hadoop中,因为硬件老化,网络故障等原因,同一个作业的某些任务执行速度可能明显慢于其他任务,这种任务会拖慢整个作业的执行速度,为了对这种
慢任务进行优化,hadoop会为之在另外一个节点上启动一个相应的任务,该任务为推测式任务,最先完成任务的计算结果便是这块数据对应的处理结果。为
防止这两个任务同时往一个输出巍峨见中写入数据时发生写冲突,FileOutputFormat会为每个Task的数据建立一个side-effect file,并将产生的数据临时
写入该文件,待Task执行完成后,再移动到输出目录。
这些文件的相关操作,由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需要
通过检测结果目录下是否存在该文件判断作业是否运行完成。
原文地址:深入解析MapReduce架构设计与实现原理–读书笔记(3)OutputFormat, 感谢原作者分享。