Hadoop 原生态支持常用 InputFormat OutFormat 详解

Hadoop原生态支持的常用输入数据格式:
 
在jobconfig中设置mapred.input.format.class
 =====================纯文本文件格式,以行为单位读入:
 TextInputFormat(key:行首在文件的偏移量,value:行内容)
    全称: org.apache.hadoop.mapred.TextInputFormat
   
    对于输入数据中没有明确的key值时非常有效,TextInputFormat返回的key值为行首在文件的偏移量,value为这行的内容。
   
    Map个数的控制
    TextInputFormat没有实现自己的getSplits方法,它继承于FileInputFormat, 因此使用了FileInputFormat的.
    org.apache.hadoop.mapred.FileInputFormat的getSplits流程:
    两个配置
        mapred.min.split.size        (一个map最小输入长度),
        mapred.map.tasks            (推荐map数量)
   
    totalSize:是整个Map-Reduce job所有输入的总大小。
    numSplits:mapred.map.tasks设置的值,给M-R框架的Map数量的提示。
    goalSize:是输入总大小与提示Map task数量的比值,即期望每个Mapper处理多少的数据,仅仅是期望,具体处理的数据数由splitSize决定。
    minSplitSize:默认为1,mapred.min.split.size 重新设置。一般情况下,都为1,特殊情况除外。
    minSize:取的1和mapred.min.split.size中较大的一个。
    blockSize:HDFS的块大小,默认为64M,一般大的HDFS都设置成128M。
    splitSize:就是最终每个Split的大小 Math.max(minSize, Math.min(goalSize, blockSize))
    那么Map的数量基本上就是totalSize/splitSize。
   
    因此, 如果想增加map数, 可以把mapred.min.split.size调小(其实默认值即可), 另外还需要把mapred.map.tasks设置大.
    如果需要减少map数,可以把mapred.min.split.size调大, 另外把mapred.map.tasks调小.
    这里要特别指出的是FileInputFormat会让每个输入文件至少产生一个map任务, 因此如果你的输入目录下有许多文件, 而每个文件都很小, 例如几十kb, 那么每个文件都产生一个map会增加调度开销. 作业变慢.
    (可以通过配置 CombineFileInputFormat 处理大量小文件的输入,因为我不考虑这种输入,故这里不展开)
   
    参考资料:
   
 KeyValueTextInputFormat(key:分隔符之前的文本,值:分隔符之后的文本)
    全称: org.apache.hadoop.mapred.KeyValueTextInputFormat
    可以通过key.value.separator.in.input.line 设置分隔符,默认为tab("\t")
    以分隔符出现的第一个位置进行切分,即使分隔符出现多次也是被切分一次,如果分隔符没有出现,则整行内容为key,value为空
    Map个数控制与TextInputFormat相同
   
 NLineInputFormat(key:行首在文件的偏移量,value:行内容)
    全称: org.apache.hadoop.mapred.lib.NLineInputFormat
    主要用于控制每个map读取多少行记录的情况。 需要注意的事情是:当输入文件行数特别大时不建议使用这个输入格式,因为统计行数、需要启动多少个map的时间开销会非常大
    Map个数控制
    每个map处理多少行记录N: 默认为1, 通过mapred.line.input.format.linespermap重新设置
 

=====================二进制文件格式:
 SequenceFileInputFormat<K,V>(键和值都是由用户定义,根据写入时key、value确定)
    全称: org.apache.hadoop.mapred.SequenceFileInputFormat
    key,value的类型在SequenceFile的头中已有记录,不可更换,参考 SequenceFileOutputFormat
   
    Map个数控制与 TextInputFormat 相同,不同之处是  mapred.min.split.size 默认为2000,而不是1
 


输出文件格式:
 TextOutputFormat是默认的输入格式
    全称: org.apache.hadoop.mapred.TextOutputFormat
    key,value 用mapred.textoutputformat.separator分开,默认是"\t",也可以自行设置
    TextOutputFormat的输出格式可以被KeyValueTextInputFormat接受
   
    如果输出的key类型为NullWritable的输出格式可以被TextInputFormat接受。在这中情况下key没有被输出来,也没有分割符。
   
 NullOutputFormat
    全称: org.apache.hadoop.mapred.lib.NullOutputFormat
    如果不想让reduce程序有任何输出我们可以把输出格式设置为NullOutputFormat。阻止hadoop的输出在reducer用自己的方式输出文件而不许要hadoop框架些任何额外文件是十分有用。
 
SequenceFileOutuputFormat<K,V>
    全称:org.apache.hadoop.mapred.SequenceFileOutuputFormat
    K 的类型可以通过  mapred.mapoutput.key.class 或者 mapred.output.key.class 设定 ,默认是 org.apache.hadoop.io.Text
    V 的类型可以通过  mapred.mapoutput.value.class 或者 mapred.output.value.class 设定,默认是 org.apache.hadoop.io.Text

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c95b355ca50704e76a5fc8bd12149d91.html