设为首页 收藏本站
查看: 1090|回复: 0

[经验分享] Hadoop如何计算map数和reduce数

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-3-11 09:54:24 | 显示全部楼层 |阅读模式

Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数。首先分析一下job的maptask数,当一个job提交时,jobclient首先分析job被拆分的split数量,然后吧job.split文件放置在HDFS中,一个job的MapTask数量就等于split的个数。

job.split中包含split的个数由FileInputFormat.getSplits计算出,方法的逻辑如下:

1.  读取参数mapred.map.tasks,这个参数默认设置为0,生产系统中很少修改。

2.  计算input文件的总字节数,总字节数/(mapred.map.tasks==0 ? 1: mapred.map.tasks )=goalsize

3.  每个split的最小值minSize由mapred.min.split.size参数设置,这个参数默认设置为0,生产系统中很少修改。

4.  调用computeSplitSize方法,计算出splitsize= Math.max(minSize, Math.min(goalSize, blockSize)),通常这个值=blockSize,输入的文件较小,文件字节数之和小于blocksize时,splitsize=输入文件字节数之和。

5.  对于input的每个文件,计算split的个数。

a)  文件大小/splitsize>1.1,创建一个split,这个split的字节数=splitsize,文件剩余字节数=文件大小-splitsize

b)  文件剩余字节数/splitsize<1.1,剩余的部分作为一个split

举例说明:

1.  input只有一个文件,大小为100M,splitsize=blocksize,则split数为2,第一个split为64M,第二个为36M

2.  input只有一个文件,大小为65M,splitsize=blocksize,则split数为1,split大小为65M

3.  input只有一个文件,大小为129M,splitsize=blocksize,则split数为2,第一个split为64M,第二个为65M(最后一个split的大小可能超过splitsize)

4.  input只有一个文件,大小为20M ,splitsize=blocksize,则split数为1,split大小为20M

5.  input有两个文件,大小为100M和20M,splitsize=blocksize,则split数为3,第一个文件分为两个split,第一个split为64M,第二个为36M,第二个文件为一个split,大小为20M

6.  input有两个文件,大小为25M和20M,splitsize=blocksize,则split数为2,第一个文件为一个split,大小为25M,第二个文件为一个split,大小为20M

假设一个job的input大小固定为100M,当只包含一个文件时,split个数为2,maptask数为2,但当包含10个10M的文件时,maptask数为10。


下面来分析reducetask,纯粹的mapreduce task的reduce task数很简单,就是参数mapred.reduce.tasks的值,hadoop-site.xml文件中和mapreduce job运行时不设置的话默认为1。

在HIVE中运行sql的情况又不同,hive会估算reduce task的数量,估算方法如下:

通常是ceil(input文件大小/1024*1024*1024),每1GB大小的输入文件对应一个reduce task。

特殊的情况是当sql只查询count(*)时,reduce task数被设置成1。


总结:通过map和reducetask数量的分析可以看出,hadoop/hive估算的map和reduce task数可能和实际情况相差甚远。假定某个job的input数据量庞大,reduce task数量也会随之变大,而通过join和group by,实际output的数据可能不多,但reduce会输出大量的小文件,这个job的下游任务将会启动同样多的map来处理前面reduce产生的大量文件。在生产环境中每个user group有一个map task数的限额,一个job启动大量的map task很显然会造成其他job等待释放资源。

Hive对于上面描述的情况有一种补救措施,参数hive.merge.smallfiles.avgsize控制hive对output小文件的合并,当hiveoutput的文件的平均大小小于hive.merge.smallfiles.avgsize-默认为16MB左右,hive启动一个附加的mapreducejob合并小文件,合并后文件大小不超过hive.merge.size.per.task-默认为256MB。

尽管Hive可以启动小文件合并的过程,但会消耗掉额外的计算资源,控制单个reduce task的输出大小>64MB才是最好的解决办法。

map数据计算示例:

hive> set dfs.block.size;
dfs.block.size=268435456
hive> set mapred.map.tasks;
mapred.map.tasks=2

文件块大小为256MB,map.tasks为2

查看文件大小和文件数:
[dwapp@dw-yuntigw-63 hadoop]$ hadoop dfs -ls /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25;
Found 18 items
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290700555 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000000_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290695945 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000001_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290182606 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000002_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  271979933 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000003_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258448208 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000004_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258440338 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000005_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258419852 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000006_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258347423 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000007_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258349480 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000008_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258301657 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000009_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258270954 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000010_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258266805 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000011_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258253133 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000012_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258236047 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000013_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258239072 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000014_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258170671 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000015_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258160711 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000016_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258085783 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000017_0

文件:大小Bytes大小MB splitsize(MB)每个文件需要的map数量
文件1
290700555
277.2336531
256
1.082943957
文件2
290695945
277.2292566
256
1.082926784
文件3
290182606
276.7396984
256
1.081014447
文件4
271979933
259.3802767
256
1.013204206
文件5
258448208
246.4754181
256
0.962794602
文件6
258440338
246.4679127
256
0.962765284
文件7
258419852
246.4483757
256
0.962688968
文件8
258347423
246.379302
256
0.962419149
文件9
258349480
246.3812637
256
0.962426811
文件10
258301657
246.3356562
256
0.962248657
文件11
258270954
246.3063755
256
0.962134279
文件12
258266805
246.3024187
256
0.962118823
文件13
258253133
246.2893801
256
0.962067891
文件14
258236047
246.2730856
256
0.962004241
文件15
258239072
246.2759705
256
0.96201551
文件16
258170671
246.2107382
256
0.961760696
文件17
258160711
246.2012396
256
0.961723592
文件18
258085783
246.1297827
256
0.961444464
总文件大小:
4759549173
4539.059804


goalSize = 4539.059804 (文件总大小)/ mapred.map.tasks(2) = 2269.529902MB

因此splitsize取值为256MB,所以一共分配18个map。

修改map.tasks参数为32
set mapred.map.tasks = 32;

文件:大小Bytes大小MB splitsize(MB)每个文件需要的map数量
文件1
290700555
277.2336531
141.8
1.955103336
文件2
290695945
277.2292566
141.8
1.955072332
文件3
290182606
276.7396984
141.8
1.951619876
文件4
271979933
259.3802767
141.8
1.829198002
文件5
258448208
246.4754181
141.8
1.738190537
文件6
258440338
246.4679127
141.8
1.738137607
文件7
258419852
246.4483757
141.8
1.737999829
文件8
258347423
246.379302
141.8
1.737512708
文件9
258349480
246.3812637
141.8
1.737526543
文件10
258301657
246.3356562
141.8
1.737204909
文件11
258270954
246.3063755
141.8
1.736998417
文件12
258266805
246.3024187
141.8
1.736970513
文件13
258253133
246.2893801
141.8
1.736878562
文件14
258236047
246.2730856
141.8
1.73676365
文件15
258239072
246.2759705
141.8
1.736783995
文件16
258170671
246.2107382
141.8
1.736323965
文件17
258160711
246.2012396
141.8
1.736256979
文件18
258085783
246.1297827
141.8
1.735753051
总文件大小:
4759549173
4539.059804


goalSize = 4539.059804 / mapred.map.tasks(32)  = 141.8456189

因此splitsize取值为141.8MB,所以一共分配36个map。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-15733-1-1.html 上篇帖子: Hadoop(9)MapReduce 性能调优:诊断性能瓶颈... 下篇帖子: 使用Maven将Hadoop2.2.0源码编译成Eclipse项目 reduce 如何
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表