#1. map个数设置
##1.1 简单设置
mapred.map.tasks=n
通过这种方式设置map的个数,并不是每次都有效的。这个参数只是一个hadoop的参考数值,最终map的个数,还取决于其他的因素
##1.2 map数的影响因素
主要由以下三个参数决定
block_size:hdfs的文件块大小,可以通过参数dfs.block.size设置
total_size:输入文件整体的大小
input_file_num:输入文件的个数
###1.2.1 默认map个数(default_map_num)
如果不进行任何设置,默认的map个数:
default_map_num=total_size/block_size;
###1.2.2 期望map个数(expect_map_num)
可以通过参数mapred.map.tasks来设置期望的map个数,但是这个个数只有在大于default_num的时候,才会生效
expect_map_num = mapred.map.tasks;
###1.2.3 通过设置处理的文件大小来影响map个数(split_map_num)
通过如下参数设置每个task处理的文件大小,但是这个大小只有在大于block_size(dfs.block.size)的时候才会生效
mapred.min.split.size=大小
split_size= max(mapred.min.split.size, block_size);
split_map_num=total_size/split_size;
###1.2.4 最终map的个数(final_map_num)
final_map_num=min(split_map_num,max(default_map_num,expect_map_num))
##1.3 总结:
mapreduce遵循的原则:mapreduce的每一个map处理的数据是不能跨越文件的,也就是说max_map_num <= input_file_num
final_map_num = min(compute_map_num, input_file_num)
在设置map个数的时候,可以参考如下几点:
a. 如果想增加map个数,则设置mapred.map.tasks 为一个较大的值。
b. 如果想减小map个数,则设置mapred.min.split.size 为一个较大的值。
c. 如果输入中有很多小文件,依然想减少map个数,则需要将小文件merger为大文件,然后使用
#2. reduce个数设置
##2.1 简单设置
mapred.reduce.tasks = number
reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数
##2.2 reduce数的影响因素
###2.2.1 reduce数的影响参数
hive.exec.reducers.bytes.per.reducer
每个reduce任务处理的数据量,在Hive-0.14.0版本之前默认值是1G(1000000000);而从Hive-0.14.0开始,默认值变成了256M(256000000)
hive.exec.reducers.max = number
每个任务最大的reduce数,在Hive-0.14.0版本之前默认值是999;而从Hive-0.14.0开始,默认值变成了1009
###2.2.2 reduce的最终数
final_reduce_num = min(hive.exec.reducers.max,总输入数据量/hive.exec.reducers.bytes.per.reducer)
#3. 其他注意点
a. map和reduce的个数并不是越多越好,启动和初始化reduce也会消耗时间和资源
b. 有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题