mapreduce中MAP数量如何控制?_mapreduce 限制map数量-程序员宅基地

技术标签: HADOOP  

一、果断先上结论
1.如果想增加map个数,则设置mapred.map.tasks 为一个较大的值。
2.如果想减小map个数,则设置mapred.min.split.size 为一个较大的值。
3.如果输入中有很多小文件,依然想减少map个数,则需要将小文件merger为大文件,然后使用准则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的多大空间?

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


值得注意的是,结果中有一个 ‘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.”

一个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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/levy_cui/article/details/52954382

智能推荐

#C语言程序设计——程序与程序设计语言#_1.c 语言中对一些标识符规定了专门的用途,如int,if,while,case等,它们(能、不-程序员宅基地

文章浏览阅读1.4k次,点赞31次,收藏16次。计算机最基本的处理数据的单元就是计算机的指令,同时一系列计算机指令的有序组合就构成了程序。下面是计算机系统常见的7条指令:假设该计算机指令系统的指令名(如 Store, Add 等),以及所涉及的数据X,Y,Z,P等。指令一:Input X;将当前数据储存到X单元中指令二:Output X;将X单元中的数据输出指令三:Add X Y Z;将X与Y中的数据相加并储存到Z中指令四:Sub X Y Z;将X与Y中的数据相减并储存到Z中指令五。_1.c 语言中对一些标识符规定了专门的用途,如int,if,while,case等,它们(能、不

php无刷新上传文件,php+iframe实现隐藏无刷新上传文件-程序员宅基地

文章浏览阅读53次。首先ajax不能上传文件,这误导了我有段时间,今晚睡不着就照着说明做了个无刷新上传文件其实原理很简单和一般的标签相比多了一个target属性罢了,用于指定标签页在哪里打开以及提交数据。如果没有设置该属性,就会像平常一样在本页重定向打开action中的url。而如果设置为iframe的name值,即"upload"的话,就会在该iframe内打开,因为CSS设置为隐藏,因而不会有任何动静。若将dis..._php无刷新上传zip文件

如何利用Packet Capture技术免费进入付费直播间-程序员宅基地

文章浏览阅读4.8k次,点赞3次,收藏17次。首先,查看数据包中的登录请求,找到登录所需的用户名和密码。通过分析直播平台与主播之间的数据包交互,我们可以找到直播数据传输的关键信息,从而模拟登录过程,实现免费观看付费直播间的目的。Packet Capture(数据包捕获)是一种网络诊断工具,可以捕获在网络上传输的数据包,以便分析和调试网络问题。通过分析捕获到的数据包,我们可以了解网络协议的通信过程,从而找到免费进入付费直播间的方法。此时,你可以访问任何网络资源,例如一个付费直播间的网址,以便捕获与该直播间相关的数据包。选择一个合适的软件并下载安装。_packet capture

linux 中/proc 详解-程序员宅基地

文章浏览阅读97次。proc 文件系统在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统。最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告的内核使用,例如/proc/modules 有模块的列表/proc/meminfo 有内存使用的统计表。  使用proc 文件系统的方法和使用设备驱动程序非常相似--创建一个/proc 文件需要的所..._(5条消息) 【linux】proc详解_zclinux_的博客-csdn博客_linux proc

路漫漫其修远兮:js的成长经历(十七)—— vue基础(一)-程序员宅基地

文章浏览阅读241次。目录什么是Vue.js为什么要学习流行框架框架和库的区别Node(后端)中的 MVC 与 前端中的 MVVM 之间的区别Vue.js 基本代码 和 MVVM 之间的对应关系Vue之 - 基本的代码结构`Vue指令之`插值表达式`、`v-cloak``v-text`和`v-html`Vue指令之`v-bind`的三种用法Vue指令之`v-on`和`跑马灯效果`跑马灯效果Vue指令之`v-on的缩写...

node.js云学堂微信小程序学习系统的设计与实现毕业设计源码011735_基于微信平台的《javascript程序设计》学习系统的设计与实现-程序员宅基地

文章浏览阅读246次。用户:免费好课、直播公开课、课程信息推荐、云学堂资讯、精选好课管理员:首页、用户管理、课程信息管理、精选好课管理、直播公开管理、免费分类管理、云学堂资讯管理_基于微信平台的《javascript程序设计》学习系统的设计与实现

随便推点

linux编译libssh2,求助linux下编译libssh2问题-程序员宅基地

文章浏览阅读702次。求助linux下编译libssh2问题linux编译libssh2时问题如下,/usr/bin/ld: /opt/openssl/lib/libcrypto.a(hmac.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -f..._linux编译 libssh2-1.9.0 提示--with-crypto

Java与C++内存管理的区别_谈谈java的内存管理及c++的不同-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏4次。java与C++内存管理的区别_谈谈java的内存管理及c++的不同

2023年江西省职业院校技能大赛信息安全管理与评估样题_某省信息安全管理与评估-程序员宅基地

文章浏览阅读1.1k次,点赞21次,收藏20次。某集团公司原在北京建立了总部,在南京设立了分公司。总部设有销售、产品、财务、信息技术4个部门,分公司设有销售、产品、财务3个部门,统一进行IP及业务资源的规划和分配,全网采用OSPF动态路由协议和静态路由协议进行互连互通。公司规模在2023年快速发展,业务数据量和公司访问量增长巨大。为了更好管理数据,提供服务,集团决定建立自己的中型数据中心及业务服务平台,以达到快速、可靠交换数据,以及增强业务部署弹性的目的。集团、分公司的网络结构详见拓扑图。其中总公司使用一台SW交换机用于总部核心和终端高速接入,采用一台B_某省信息安全管理与评估

next.js博客搭建_六一卡通风格的登录注册(第二步)_nextjs登录窗口-程序员宅基地

文章浏览阅读3.5w次。大家好,我是yma16,本期给大家分享next项目渲染markdown。该系列的往期文章博客搭建_初始化next项目。_nextjs登录窗口

Wordpress 永久链接_wordpress永久免费-程序员宅基地

文章浏览阅读8.6k次。 前段时间架了个Wordpress的博客,开始一直蛮顺利的,一直后来发现在改永久链接的时候,改后居然出现404错误。百度一下,网上说Mod_rewrite要打开,于是也就按照着网上的方法,试了很多都不是很见成效。也有说linux平台下不存在问题,于是就尝试了下ubuntu,可是依然存在问题,找找啊,弄啊弄,最终还是成功了,以下是个人整理的方法,仅供我等菜鸟参考。 :)------------------------------------------------------------------_wordpress永久免费

MIT开源协议,多端适用的租房小程序,带完整的管理员后台_使用到mit的开源项目-程序员宅基地

文章浏览阅读769次。这个项目的经历也让作者明白了一些事情,就是如果别人委托自己帮做项目的时候,不管项目的规模如何,在接受委托前一定要考虑清楚。特别是没有付定金的这种委托,一定要谨慎,不要期望那种说你先做着后面再谈钱,哪怕是跟你认识的人也是一样要谨慎。在项目快完成的时候,介绍的那个人跑路了,所以就没有后续了,想着与其直接删除还不如开源分享给大家一起讨论学习。1、使用Uniapp开发的前台,基于 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序。_使用到mit的开源项目

推荐文章

热门文章

相关标签