【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?

1、果断先上结论

1.如果想增加map个数,则设置mapred.map.tasks 为一个较大的值。

2.如果想减小map个数,则设置mapred.min.split.size 为一个较大的值。

3.如果输入中有很多小文件,依然想减少map个数,则需要将小文件merger为大文件,然后使用准则2。

2、原理与分析过程

看了很多博客,感觉没有一个说的很清楚,所以我来整理一下。

先看一下这个图


输入分片(Input Split):在进行map计算之前,mapreduce会根据输入文件计算输入分片(input split),每个输入分片(input split)针对一个map任务,输入分片(input 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

那么分片到底是多大呢?

minSize=max{minSplitSize,mapred.min.split.size}

maxSize=mapred.max.split.size

splitSize=max{minSize,min{maxSize,blockSize}}

我们再来看一下源码

所以在我们没有设置分片的范围的时候,分片大小是由block块大小决定的,和它的大小一样。比如把一个258MB的文件上传到HDFS上,假设block块大小是128MB,那么它就会被分成三个block块,与之对应产生三个split,所以最终会产生三个map task。我又发现了另一个问题,第三个block块里存的文件大小只有2MB,而它的block块大小是128MB,那它实际占用Linux file system的多大空间?

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

有大神已经验证这个答案了:http://blog.csdn.net/samhacker/article/details/23089157

1、往hdfs里面添加新文件前,hadoop在linux上面所占的空间为 464 MB:

2、往hdfs里面添加大小为2673375 byte(大概2.5 MB)的文件:

2673375 derby.jar

3、此时,hadoop在linux上面所占的空间为 467 MB——增加了一个实际文件大小(2.5 MB)的空间,而非一个block size(128 MB)

4、使用hadoop dfs -stat查看文件信息:

这里就很清楚地反映出: 文件的实际大小(file size)是2673375 byte, 但它的block size是128 MB。

5、通过NameNode的web console来查看文件信息:

结果是一样的: 文件的实际大小(file size)是2673375 byte, 但它的block size是128 MB。

6、不过使用‘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)。

hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数。但是通过这种方式设置map的个数,并不是每次都有效的。原因是mapred.map.tasks只是一个hadoop的参考数值,最终map的个数,还取决于其他的因素。

为了方便介绍,先来看几个名词:

block_size : hdfs的文件块大小,默认为64M,可以通过参数dfs.block.size设置

total_size : 输入文件整体的大小

input_file_num : 输入文件的个数

(1)默认map个数

如果不进行任何设置,默认的map个数是和blcok_size相关的。

default_num = total_size / block_size;

(2)期望大小

可以通过参数mapred.map.tasks来设置程序员期望的map个数,但是这个个数只有在大于default_num的时候,才会生效。

goal_num = mapred.map.tasks;

(3)设置处理的文件大小

可以通过mapred.min.split.size 设置每个task处理的文件大小,但是这个大小只有在大于block_size的时候才会生效。

split_size = max(mapred.min.split.size, block_size);

split_num = total_size / split_size;

(4)计算的map个数

compute_map_num = min(split_num,  max(default_num, goal_num))

除了这些配置以外,mapreduce还要遵循一些原则。 mapreduce的每一个map处理的数据是不能跨越文件的,也就是说min_map_num >= input_file_num。 所以,最终的map个数应该为:

final_map_num = max(compute_map_num, input_file_num)

经过以上的分析,在设置map个数的时候,可以简单的总结为以下几点:

(1)如果想增加map个数,则设置mapred.map.tasks 为一个较大的值。

(2)如果想减小map个数,则设置mapred.min.split.size 为一个较大的值。

(3)如果输入中有很多小文件,依然想减少map个数,则需要将小文件merger为大文件,然后使用准则2。

参考资料:

http://blog.csdn.net/dr_guo/article/details/51150278

时间: 2024-10-05 04:01:33

【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?的相关文章

用七年时间造出的阿里云,如今三句话告诉你是什么

马云在2016年10月杭州云栖大会的主题演讲中只字未提"阿里云",但这并不说明阿里云不重要,而是在某种意义上说明在马云的心里,阿里云"从0到1"的阶段已经完成了. 在10月13日杭州云栖大会开幕当天,马云发表了就上一财年致股东信,信中提及阿里云承载了中国35%的网站并为之提供云计算和大数据的服务,而截至2016年3月31日的阿里财报显示阿里云拥有超过230万用户,其中云计算付费用户达50万. 从2009年2月写下阿里云的第一段代码开始,阿里云上上下下的负责人们就一直

快来对号入座!四句话告诉你怎样的企业适用于移动平台

眼下,移动平台成为各大企业竞相追捧的"香饽饽",然而,并不是所有的企业一开始都需要选用企业级移动平台,移动平台技术也不是满足所有企业的移动化转型需求.那么,究竟什么样的企业才适合用于移动平台呢?下面,小编用四句话告诉你. 1.组织结构较为复杂 大中型企业拥有很多分支机构和部门,政府机关也包括很多的下属单位,每个机构和单位都存在移动应用的建设诉求,如果每个单位或部门都单独建设移动应用项目,那么在项目建设上会存在极大浪费,并且后续的运维管理也面临很多的困难,所以这种体量较大的组织机构需要构

三句话让你面试成功率提高50%

这个题目真不是标题党,三句话听懂真能达到面试成功率提高50%的效果.这些年我参与过不少面试,也面试过别人不少次.我参与的面试,基本都能拿到offer,印象中也就挂过一两次.从毕业找工作开始就被周围的人封为"面霸",但是好多人可能都是以为我靠的是忽悠,其实是他们搞不懂面试的本质,更确切的说是不懂自我营销的艺术.后来我工作了,开始走上管理岗位了,也开始面试别人,但是大部分面试者实在太差劲了,交谈过程根本给不到我想要的东西,以至于我觉得中国的求职培训其实是很有必要的.如果你本身不太擅长面试,

新年上班第一天:浏阳市委书记三句话感动“乡”商(图)c

新年上班第一天:浏阳市委书记三句话感动"乡"商(图)德乙混的二比零领先本赛季德乙联赛最大黑马霍芬海姆几乎已经提前完成了是在主场战胜霍芬海姆后本赛季的j5ml6h.mkayf.cn/p1vf2y.mkayf.cn/odext6.mkayf.cn/r4gjwf.mkayf.cn/tyjfjk.mkayf.cn/q5211p.mkayf.cn/h3466x.mkayf.cn/v37a8w.mkayf.cn/h73e5x.mkayf.cn/u8rc5r.mkayf.cn/gz3oz1.mkay

人生三句话

很多时候,人们往往善于忘记别人对自己的好处,而一旦出现无心的冒犯,却总是耿耿于怀,变成了话不投机半句多,甚至老死不相往来. 人生在世,不可避免地要与人交往,要想过得愉快,就要处理好自己与身边人的关系.处理好人际关系,要记住三句话,"看人长处.帮人难处.记人好处". 看人长处 人无完人,每个人都有缺点,如果你总是盯着别人的缺点不放,你们的关系肯定好不了,反之,学会换位思考,多看别人的优点,你就会发现,越看别人就越顺眼,就能与人处好关系,就懂得用人所长. 帮人难处 就是在别人困难的时候,伸

三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!

http://bbs.tianya.cn/post-house-482606-1.shtml 看见很多菜人花了老爸老妈一辈子的钱买了破房,哥心痛呀,做点善事,教你一下,三分钟学会买房,看了此贴买到好房的都给哥祝福一下:三年内赚两个亿! 买房很简单,就三句话,记住就行,对着这几个字去买,百分百对. 三句话总概述为:五无,六有,四基本. 四基本:透,亮,正,静. 五无:立交,工厂,医院,幅射,污柒. 六有:山,水,学校,公园,地铁,商超. 以上几条不可能全达到,但达到越多者房子越好. 再送几句买房要

老板三句话受用一辈子

一个男人在外工作20年,终于要回家了,     老板问他:你是要20年的工资还是要3句忠告?男人说我明天上路,明早给您答案好吗?老板说可以.当晚男人未眠…     早晨,他对老板说:我要3个忠告.于是老板给他3句话.     一.不要试图寻找不可能的捷径,世上没有便宜的事,只有脚踏实地才是最好的方法…无论做何事.     二.不要对明知不是好事的事过分好奇,有可能你会因此而丧命.     三.不要在冲动时做任何决定,否则这个决定就有可能成为你一辈子的遗憾.说完老板给男人一些钱和三个面包,并叮嘱:

MapReduce中Map数量的控制

InputFormat这个类是用来处理Map的输入数据的,任务开始时,InputFormat先将HDFS里所有输入文件里的数据分割成逻辑上的InputSpilt对象 这里的split是HDFS中block的部分或者一整块或几个快中的数据的逻辑分割,一个split对应于一个Map,所以Map的数量是由split的数量决定的. 那么怎样去确定InputSpilt的个数呢,下面列出于split个数相关的配置参数: numSplits:来自job.getNumMapTasks(),即在job启动时用or

三句话影响人的一生

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 一个男人在外工作20年,终于要回家了,老板问他:你是要20年的工资还是要3句忠告?男人说我明天上路,明早给您答案好吗?老板说可以.当晚男人未眠…早晨,他对老板说:我要3个忠告.于是老板给他3句话.一.不要试图寻找不可能的捷径,世上没有便宜的事,只有脚踏实地才是最好的方法…无论做何事.二.不要对明知不是好事的事过分好奇,有可能你会因此