针对前面介绍的输入格式,MapReduce也有相应的输出格式。默认情况下只有一个 Reduce,输出只有一个文件,默认文件名为 part-r-00000,输出文件的个数与 Reduce 的个数一致。 如果有两个Reduce,输出结果就有两个文件,第一个为part-r-00000,第二个为part-r-00001,依次类推
OutputFormat 接口
OutputFormat主要用于描述输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件中。Hadoop 自带了很多 OutputFormat 的实现,它们与InputFormat实现相对应,足够满足我们业务的需要。 OutputFormat 类的层次结构如下图所示
OutputFormat是MapReduce输出的基类,所有MapReduce输出都实现了 OutputFormat 接口。 我们可以把这些实现接口类分为以下几种类型,下面分别一一介绍
1、文本输出
默认的输出格式是TextOutputFormat,它把每条记录写为文本行。它的键和值可以是任意类型,因为TextOutputFormat调用toString()方法把它们转换为字符串。每个键/值对由制表符进行分割,当然也可以设定 mapreduce.output.textoutputformat.separator 属性(旧版本 API 中的 mapred.textoutputformat.separator)改变默认的分隔符。与 TextOutputFormat对应的输入格式是KeyValueTextInputFormat,它通过可配置的分隔符将键/值对文本分割。
可以使用NullWritable来省略输出的键或值(或两者都省略,相当于 NullOutputFormat输出格式,后者什么也不输出)。这也会导致无分隔符输出,以使输出适合用 TextInputFormat 读取
2、二进制输出
1、关于SequenceFileOutputFormat
顾名思义,SequenceFileOutputFormat 将它的输出写为一个顺序文件。如果输出需要作为后续 MapReduce 任务的输入,这便是一种很好的输出格式, 因为它的格式紧凑,很容易被压缩。
2、关于SequenceFileAsBinaryOutputFormat
SequenceFileAsBinaryOutputFormat 把键/值对作为二进制格式写到一个 SequenceFile 容器中。
3、关于MapFileOutputFormat
MapFileOutputFormat 把 MapFile 作为输出。MapFile 中的键必须顺序添加,所以必须确保reducer输出的键已经排好序
3、多个输出
上面我们提到,默认情况下只有一个 Reduce,输出只有一个文件。有时可能需要对输出的文件名进行控制或让每个 reducer 输出多个文件。 我们有两种方式实现reducer输出多个文件。
1、Partitioner
具体示例,请参考”使用Partitioner实现输出到多个文件”
这种方法实现多文件输出,很多情况下是无法实现的,因为存在以下两个缺点。
第一,需要在作业运行之前需要知道分区数,如果分区数未知,就无法操作。
第二,一般来说,让应用程序来严格限定分区数并不好,因为可能导致分区数少或分区不均
2、MultipleOutputs类
MultipleOutputs 类可以将数据写到多个文件,这些文件的名称源于输出的键和值或者任意字符串。这允许每个 reducer(或者只有 map 作业的 mapper)创建多个文件。采用name-m-nnnnn 形式的文件名用于 map 输出,name-r-nnnnn 形式的文件名用于 reduce 输出,其中 name 是由程序设定的任意名字, nnnnn 是一个指明块号的整数(从 0 开始)。块号保证从不同块(mapper 或 reducer)输出在相同名字情况下不会冲突。
具体示例,请参考”通过MultipleOutputs写到多个文件”
4、数据库输出
DBOutputFormat 适用于将作业输出数据(中等规模的数据)转存到Mysql、Oracle等数据库;使用DBOutputFormat以MapReduce的方式运行,会并行的连接数据库。在这里需要合适的设置map、reduce的个数,以便将并行连接的数量控制在合理的范围之内
具体示例,请参考“使用DBOutputFormat把MapReduce产生的结果集导入到mysql中”
本文版权归作者和csdn共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。