看了不少博客,感受没有一个说的很清楚,因此我来整理一下。linux
先看一下这个图程序员
输入分片(Input Split):在进行map计算以前,mapreduce会根据输入文件计算输入分片(input split),每一个输入分片(input split)针对一个map任务,输入分片(input split)存储的并不是数据自己,而是一个分片长度和一个记录数据的位置的数组。web
Hadoop 2.x默认的block大小是128MB,Hadoop 1.x默认的block大小是64MB,能够在hdfs-site.xml中设置dfs.block.size,注意单位是byte。数组
分片大小范围能够在mapred-site.xml中设置,mapred.min.split.size mapred.max.split.size,minSplitSize大小默认为1B,maxSplitSize大小默认为Long.MAX_VALUE = 9223372036854775807
app
那么分片究竟是多大呢?less
minSize=max{minSplitSize,mapred.min.split.size} oop
maxSize=mapred.max.split.sizethis
splitSize=max{minSize,min{maxSize,blockSize}}spa
咱们再来看一下源码.net
答案是实际的文件大小,而非一个块的大小。
有大神已经验证这个答案了:http://blog.csdn.net/samhacker/article/details/23089157
一、往hdfs里面添加新文件前,hadoop在linux上面所占的空间为 464 MB:
二、往hdfs里面添加大小为2673375 byte(大概2.5 MB)的文件:
2673375 derby.jar
三、此时,hadoop在linux上面所占的空间为 467 MB——增长了一个实际文件大小(2.5 MB)的空间,而非一个block size(128 MB):
四、使用hadoop dfs -stat查看文件信息:
这里就很清楚地反映出: 文件的实际大小(file size)是2673375 byte, 但它的block size是128 MB。
五、经过NameNode的web console来查看文件信息:
结果是同样的: 文件的实际大小(file size)是2673375 byte, 但它的block size是128 MB。
六、不过使用‘hadoop fsck’查看文件信息,看出了一些不同的内容—— ‘1(avg.block size 2673375 B)’:
值得注意的是,结果中有一个 ‘1(avg.block size 2673375 B)’的字样。这里的 'block size' 并非指日常说的文件块大小(Block Size)—— 后者是一个元数据的概念,相反它反映的是文件的实际大小(file size)。如下是Hadoop Community的专家给个人回复:
“The fsck is showing you an "average blocksize", not the block size metadata attribute of the file like stat shows. In this specific case, the average is just the length of your file, which is lesser than one whole block.”
最后一个问题是: 若是hdfs占用Linux file system的磁盘空间按实际文件大小算,那么这个”块大小“有必要存在吗?
其实块大小仍是必要的,一个显而易见的做用就是当文件经过append操做不断增加的过程当中,能够经过来block size决定什么时候split文件。如下是Hadoop Community的专家给个人回复:
“The block size is a meta attribute. If you append tothe file later, it still needs to know when to split further - so it keeps that value as a mere metadata it can use to advise itself on write boundaries.”
补充:我还查到这样一段话
原文地址:http://blog.csdn.net/lylcore/article/details/9136555
一个split的大小是由goalSize, minSize, blockSize这三个值决定的。computeSplitSize的逻辑是,先从goalSize和blockSize两个值中选出最小的那个(好比通常不设置map数,这时blockSize为当前文件的块size,而goalSize是文件大小除以用户设置的map数获得的,若是没设置的话,默认是1)。