MapReduce中的输入输出控制(转)
—— InputFormat、OutputFormat、MultipleOutputs、GroupingComparator
1.InputFormat概述
MapReduce开始阶段,InputFormat类用来产生InputSplit,并基于RecordReader把它切分成record,形成Mapper的输入。
——MR内置的InputFormat
1)TextInputFormat
作为默认的文件输入格式,用于读取纯文本文件,文件被分为一系列以LF或者CR结束的行,key是每一行的位置偏移量,是LongWritable类型的,value是每一行的内容,为Text类型。
2)KeyValueTextInputFormat
同样用于读取文本文件,如果行被分隔符(缺省是tab)分割为两部分,第一部分为key,剩下的部分为value;如果没有分隔符,整行作为 key,value为空。
3)SequenceFileInputFormat
用于读取sequence file
sequence file是Hadoop用于存储数据自定义格式的binary文件。它有两个子类:SequenceFileAsBinaryInputFormat,将 key和value以BytesWritable的类型读出;SequenceFileAsTextInputFormat,将key和value以Text类型读出。
4)SequenceFileInputFilter
根据filter从sequence文件中取得部分满足条件的数据,通过 setFilterClass指定Filter,内置了三种 Filter:
- RegexFilter取key值满足指定的正则表达式的记录;
- PercentFilter通过指定参数f,取记录行数%f==0的记录;
- MD5Filter通过指定参数f,取MD5(key)%f==0的记录。
5)NLineInputFormat
0.18.x新加入,可以将文件以行为单位进行split,比如文件的每一行对应一个mapper。得到的key是每一行的位置偏移量(LongWritable类型),value是每一行的内容,Text类型。
6)CompositeInputFormat
用于多个数据源的join
——为MR设置指定的InputFormat
job.setInputFormatClass(XXXInputFormat.class);
——也可以自定义InputFormat
自己写一个类直接或间接的继承InputFormat抽象类即可
2.MR中的输出控制-OutputFormat
MapReduce结束阶段,OutputFormat类决定了Reducer如何产生输出。
https://blog.csdn.net/zhanglh046/article/details/78557453
- 2.1DBOutputFormat: 发送Reduce结果到SQL表中
- 2.2FileOutputFormat: 将Reduce结果写入文件中
2.2.1MapFileOutputFormat: 主要是处理MapFile(特殊的SequenceFile)的输出
2.2.2SequenceFileOutputFormat: 主要是处理SequenceFile的输出
2.2.3TextFileOutputFormat: 主要是处理普通文本的输出,也是默认实现
- 2.3FilterOutputFormat:主要就是方便包装其他OutputFromat(没用过)
- 2.4NullOutputFormat: 把所有的输出放到/dev/null(没用过)
——MR内置的OutputFormat
1)TextOutputFormat
以行分隔、包含制表符定界的键值对的文本文件格式
2)SequenceFileOutputFormat
二进制键值数据的压缩格式
3)SequenceFileAsBinaryOutputFormat
原生二进制数据的压缩格式
4)MapFileOutputFormat
一种使用部分索引键的格式
——为MR设置指定的OutputFormat
job.setOutputFormatClass(SequenceFileOutputFormat.class);
——同理也可以自定义输出格式化器
所有的OutputFormat都要直接或间接的继承OutputFormat抽象类
// 要控制不同的内容写往不同的目标路径,可以采用自定义outputformat的方法 job.setOutputFormatClass(LogEnhanceOutputFormat.class); // 尽管我们用的是自定义outputformat,但是它是继承制fileoutputformat // 在fileoutputformat中,必须输出一个_success文件,所以在此还需要设置输出path FileOutputFormat.setOutputPath(job, new Path("H:/out/"));
原文链接:https://blog.csdn.net/zhou920786312/java/article/details/87031643
OutputFormat抽象类中定义了如下的抽象方法:
public abstract RecordWriter<K, V> getRecordWriter(TaskAttemptContext context) public abstract void checkOutputSpecs(JobContext context ) public abstract OutputCommitter getOutputCommitter(TaskAttemptContext context)
我们可以直接继承OutputFormat,但更多的时候我们会选择继承他的一个实现子类,比如FileOutputFormat -- 此类是所有目的地为文件的OutputFormat的基类,例如默认的TextOutputFormat就继承自它。
FileOutputFormat实现了OutputFormat接口,默认实现了checkOutputSpecs和getOutputCommitter方法,并将getRecordWriter()设置为抽象方法要求我们去实现。
如果想要更精细的改变逻辑可以自己去编写getOutputCommitter和checkOutputSpecs方法。
而更多的时候,我们直接使用父类中的方法而将精力放置在getRecordWriter上,决定如何产生输出。