block_size=128; #hadoop2.x
split_size;
goal_num=mapred.map.task(用户设定)
goal_size=total_size/goal_num;
default_num = total_size/block_size(初始);
input_file_num;
1)若想增加map数量,则直接设置mapred.map.tasks为较大值即可(>default_num),因为设置mapred.map.tasks函数只在大于default_num时才生效
2)若想减小map数量,则设置mapred.min.split.size为一个较大的值即可(>block_size),因为
split_size = max(mapred.min.split.size , block_size)
split_num = total_size/split_size
如果total_size/split_size取余之后的数小于12.8M,则不重新为其切分一块,而是将其归于上一切片中,为了避免计算资源的浪费。
综上,map进程数量可计算为
compute_map_num = min(split_num , max(goal_num , default_num))
但考虑到mapreduce中每一个map处理的数据是不能跨越文件的,故有min_map_num >= input_file_num
final_map_num = max(compute_map_num, input_file_num)
其他详见https://www.cnblogs.com/junneyang/p/5850440.html`[【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?]