[转帖]Hadoop 原生态支持常用 InputFormat OutFormat 详解_Hadoop,ERP及大数据讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Hadoop,ERP及大数据讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3094 | 回复: 0   主题: [转帖]Hadoop 原生态支持常用 InputFormat OutFormat 详解        下一篇 
huizai
注册用户
等级:少校
经验:933
发帖:83
精华:0
注册:2013-6-18
状态:离线
发送短消息息给huizai 加好友    发送短消息息给huizai 发消息
发表于: IP:您无权察看 2013-6-24 9:32:41 | [全部帖] [楼主帖] 楼主

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 处理大量小文件的输入,因为我不考虑这种输入,故这里不展开)


    参考资料: http://blog.csdn.net/strongerbit/article/details/7440111

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




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论