Hadoop之MapReduce输入(split)输出

[size=x-large][b]Split分割[/b][/size]
在执行mapreduce之前,[b][color=red]原始数据被分割成若干split,每个split作为一个map任务的输入[/color][/b],
在map执行过程中split会被分解成一个个记录(key-value对),map会依次处理每一个记录。
[color=red][b](Key:偏移量,不是行数)[/b][/color]

[color=blue][size=large][b]FileInputFormat:[/b][/size][/color]

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任务处理。

[size=large][color=red][b]获得了输入文件后,FileInputFormat是怎样将他们划分成splits的呢?[/b][/color][/size]

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中的半行;[color=red][b]然而另一个map
读入第二个split时,会自动跳过第一个换行符;[/b][/color]

//此方法每次只读取一行数据,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


转自:[url]http://www.cnblogs.com/zhanghuijunjava/archive/2013/04/25/3036512.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值