Hadoop如何计算map数和reduce数

来源:互联网 发布:发那科机器人基础编程 编辑:程序博客网 时间:2024/06/10 11:17

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数量文件1290700555277.2336531 2561.082943957文件2290695945277.2292566 2561.082926784文件3290182606276.7396984 2561.081014447文件4271979933259.3802767 2561.013204206文件5258448208246.4754181 2560.962794602文件6258440338246.4679127 2560.962765284文件7258419852246.4483757 2560.962688968文件8258347423246.379302 2560.962419149文件9258349480246.3812637 2560.962426811文件10258301657246.3356562 2560.962248657文件11258270954246.3063755 2560.962134279文件12258266805246.3024187 2560.962118823文件13258253133246.2893801 2560.962067891文件14258236047246.2730856 2560.962004241文件15258239072246.2759705 2560.96201551文件16258170671246.2107382 2560.961760696文件17258160711246.2012396 2560.961723592文件18258085783246.1297827 2560.961444464总文件大小:47595491734539.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数量文件1290700555277.2336531 141.81.955103336文件2290695945277.2292566 141.81.955072332文件3290182606276.7396984 141.81.951619876文件4271979933259.3802767 141.81.829198002文件5258448208246.4754181 141.81.738190537文件6258440338246.4679127 141.81.738137607文件7258419852246.4483757 141.81.737999829文件8258347423246.379302 141.81.737512708文件9258349480246.3812637 141.81.737526543文件10258301657246.3356562 141.81.737204909文件11258270954246.3063755 141.81.736998417文件12258266805246.3024187 141.81.736970513文件13258253133246.2893801 141.81.736878562文件14258236047246.2730856 141.81.73676365文件15258239072246.2759705 141.81.736783995文件16258170671246.2107382 141.81.736323965文件17258160711246.2012396 141.81.736256979文件18258085783246.1297827 141.81.735753051总文件大小:47595491734539.059804   

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

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

原文出处:http://blog.csdn.net/lpxuan151009/article/details/7937821

原创粉丝点击