首先注意的是在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