专栏名称: About云
about云-为热爱云开发技术人员提供最全面的信息传播和服务平台
目录
相关文章推荐
51好读  ›  专栏  ›  About云

MapReduce执行过程分析【问题】

About云  · 公众号  ·  · 2018-04-22 16:23

正文

这个是个问题贴,由about云会员提问。会员答疑。提问和回答都比较有水平,分享出来。


1. MapReduce输入的时候,会对HDFS上面的文件进行split,切分的原则是什么样子的?假如HDFS默认文件存储块大小是64MB。如果一个129MB的文件存在HDFS上面,会有三个文件块,分别是64MB/64MB/1MB。那么此时进行切分的时候,是split为几分?


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的多大空间?

答案是实际的文件大小,而非一个块的大小。

这里更加简洁的总结:
Split的最大值为:max_split

Split的最小值为:min_split

Block的大小:block

切分规则:max(min_split,min(max_split,block)),主要是为了减少网络带宽。
咱们套用上面的公式:
min_split=1b
max_split=Long.MAX_VALUE = 9223372036854775807

max(1,min(9223372036854775807,64M))
这里显然split为64M
既然为64M,那么64MB/64MB/1MB。那么此时进行切分的时候,是split为几分?
应该且分为3份


2. 切分后,是否每一个切分文件对应一个map任务?

第二个问题,这个比较简单了



如上图每一个split,都对应一个map任务


3. 基于1和2两个问题,是否可以认为:每一个文件块对应一个split的文件,并且对应一个map任务?

第三个问题 我们同样看上图,一个文件有很多split,对应多个map任务



4. 每一个MapReduce任务对应几个map,由什么决定的某一个MR任务有几个map任务?

同样第四个问题: 我们还是看上图, map任务的个数由分片来决定,也就是split决定。当然也可以通过配置 JobConf.setNumMapTasks(n),但是如果小于split,不会生效的。大于split才会生效



5. 如果一个MR job有5个map,那么这5个map是每一个结算节点上一个map任务吗?还是可以多个map在同一个计算节点上?还是根据hadoop的移动计算的原理而来,数据块文件在哪里,map任务就在哪里?







请到「今天看啥」查看全文