上面问题,问的都非常的细致。研究研究,分多次回答,楼主有问题和看法也可以交流。
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。【额外说明这里由于版本更新hadoop2.x后面版本及hadoop3.x mapred.min.split.size更改为mapreduce.input.fileinputformat.split.minsize maxSplitSize更改为: mapreduce.job.split.metainfo.maxsize 】 那么分片到底是多大呢?
minSize=max{minSplitSize,mapred.min.split.size} maxSize=mapred.max.split.size splitSize=max{minSize,min{maxSize,blockSize}} 从上面我们看出分片原则: split分片其实是综合得来的,并不是固定的,而且他和blocksize是有关系的。 首先还是自己的配置,也就是你配置的分片大小。然后最后得出结果。比如你的
我们再来看一下源码
所以在我们没有设置分片的范围的时候,分片大小是由block块大小决定的,和它的大小一样。比如把一个258MB的文件上传到HDFS上,假设block块大小是128MB,那么它就会被分成三个block块,与之对应产生三个split,所以最终会产生三个map task。我又发现了另一个问题,第三个block块里存的文件大小只有2MB,而它的block块大小是128MB,那它实际占用Linux file system的多大空间?答案是实际的文件大小,而非一个块的大小。 后面在研究下新版本。继续作答
|