Hadoop MapReduce中map任务数量设定详解

本文详细解析了在Hadoop MapReduce中设置map任务数量的方法,包括通过-D mapred.map.tasks设定目标数量,以及如何根据total_size、block_size和mapred.min.split.size计算默认值。同时,讨论了map任务数量的限制因素,如输入文件数量,并提出了合理设定map个数的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先注意的是在Hadoop Streaming 中可以通过-D mapred.map.tasks=(你想要设定的map数量) 来确定map任务的个数,

goal_num = mapred.map.tasks

但是这里需要注意的是,只有在这个值大于hadoop中计算的默认个数default_num的时候才会有效,默认个数的计算方式如下:

default_num = total_size / block_size;

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

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

split_num = total_size /split_size

在计算map的个数时:

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

这个是参考的https://blog.youkuaiyun.com/dr_guo/article/details/51150278      感觉应该用错误,因为当goal_num设置为一个较大的数时,计算的compute_map_num为goal_num

这里可以看出split_num <= default_num,所以上述值其实就为split_num,

整理一下 : 

split_num 肯定会小于或等于默认的分块大小,即:split_num <=default_num

而当期望的map个数goal_num > default>num时才会有用

个人认为compute_num该这么取 compute_num = max(min(split_num,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。

 

其中主要思想引自https://blog.youkuaiyun.com/Dr_Guo/article/details/51150278

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值