一、Map阶段的优化(Mapphase)
1. Map数的计算公式为:
num_Map_tasks=max[${Mapred.min.spilt.size},min(${dfs.block.size},${Mapred.max.split.size})]
Mapred.min.spilt.size指的是数据的最小分割单元大小(默认为1B)
Mapred.max.split.size指的是数据的最大分割单元大小(默认为256MB)
dfs.block.size指的是HDFS设置的数据块大小(这个值是在配置文件中定好的,而且Hive是获取不到的)
所以Map的数量是由Mapred.min.spilt.size、Mapred.max.split.size这两个参数的最大值决定的。如果不做修改的话一个Map Task处理256MB的数据,增大Mapred.max.split.size的值可以减少Map的数量,减少Mapred.max.split.size的值可以增大Map的数量。但是直接修改Mapred.Map.tasks是没有效果的。如果运行速度较慢,可以考虑增加Map的数量,增加并行度,如果运行速度较快,增加Map数量不太可能加快速度,反而有可能因为初始化Map使速度变慢,此时可以考虑减少Map,这样可以节省更多资源给其他Job
二、Reduce阶段的优化(Reudcephase)
1. reduce数的计算公式为:
num_Reduce_tasks=min[${Hive.exec.Reduces.max},(${input.size}/ ${Hive.exec.Reducers.bytes.per.Reducer})]
Hive.exec.Reducers.bytes.per.Reducer(默认值为1G)