设为首页 收藏本站
查看: 1257|回复: 0

[经验分享] hadoop之MapReduce输入(split)输出

[复制链接]

尚未签到

发表于 2015-7-13 10:40:13 | 显示全部楼层 |阅读模式
Split分割
在执行mapreduce之前,原始数据被分割成若干split,每个split作为一个map任务的输入,
在map执行过程中split会被分解成一个个记录(key-value对),map会依次处理每一个记录。
(Key:偏移量,不是行数)
FileInputFormat:
        FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInputFormat
        保存作为job输入的所有文件,并实现了对输入文件计算splits的方法。至于获得记录的
        方法是有不同的子类进行实现的;

        1) FileInputFormat只划分比HDFS block大的文件,所以FileInputFormat划分的结果是
           这个文件或者是这个文件中的一部分.               
        2) 如果一个文件的大小比block小,将不会被划分,这也是Hadoop处理大文件的效率要比
           处理很多小文件的效率高的原因。
        3) 当Hadoop处理很多小文件(文件大小小于hdfs block大小)的时候,由于FileInputFormat
          不会对小文件进行划分,所以每一个小文件都会被当做一个split并分配一个map任务,导致
          效率底下。
        例如:
             一个1G的文件,会被划分成16个64MB的split,并分配16个map任务处理,而10000个
             100kb的文件会被10000个map任务处理。

获得了输入文件后,FileInputFormat是怎样将他们划分成splits的呢?
input file -->split -->map task
计算SplitSize的函数很简单:
       splitSize = max(minsize,min(maxSize,blockSize)) = 64M;
       maxSize = mapred.max.split.size 默认最大值整数值
       minSize = mapred.min.split.size 默认0

那么我们如何处理同一行垮Split问题呢?

首先map任务getSplit读入一个split-->recordReader一行一行读取数据,如果有一行数据在
两个split中,map读入第一个split后,会去读取留在另一个split中的半行;然而另一个map
读入第二个split时,会自动跳过第一个换行符;

  //此方法每次只读取一行数据,key为偏移量,value为本行数据

public void map(Object key, Text value, Context context)
   throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
   }
}            
分割成split(不支持的除外)比如:1G的文件切割成64M,放到一个map里面,如果不支持直接把1G
放到map里面
解释map方法中的(key偏移量-value对):
abcdefghigklmnopqrstuvwxyz        key = 0     value=abcdefghigklmnopqrstuvwxyz  
abcdefghigklmnopqrstuvwxyz        key = 26   value=abcdefghigklmnopqrstuvwxyz  
abcdefghigklmnopqrstuvwxyz        key = 52   value=abcdefghigklmnopqrstuvwxyz

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-86224-1-1.html 上篇帖子: [hadoop源码阅读][4]-org.apache.hadoop.io.compress系列2-选择编解码器 下篇帖子: hadoop 异常记录 Cannot delete /tmp/hadoop/mapred/system. Name node is in safe mode.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表