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