众所周知,Hive会将SQL翻译转换成对应的MAPREDUCE任务,通过执行MAPREDUCE任务来获得最终想要的结果(执行引擎限定为mr时)。对于MAPRDUCE任务来说,选取不同的参数会生成不同的mapper与reducer数量,这对任务的执行效率有很大的影响。
- REDUCER数量:
mapred.reduce.tasks: 直接指定reducer数量
如set mapred.reduce.tasks = 10
hive.exec.reducers.bytes.per.reducer:指定每个reducer处理的数据量
如set hive.exec.reducers.bytes.per.reducer = 500000000
(500M)
-
MAPPER数量:
mapred.max.split.size 单个mapper处理的最大splits数量
如set mapred.max.split.size = 100000000
hive.input.format 设置为CombineHiveInputFormat可以合并小文件
如set hive.input.format = CombineHiveInputFormat
- mapper数量计算公式
一个分片对应一个mapper
splitSize = max{minSize,min{maxSize,blockSize}} maxSize = mapred.max.split.size minSize = max{mapreduce.input.fileinputformat.split.minsize, mapred.min.split.size}
- mapper数量计算公式
其他:
mapreduce.jobtracker.split.metainfo.maxsize 如果输入文件过多,会造成split源文件超过默认值,需要调整该参数。
如set mapreduce.jobtracker.split.metainfo.maxsize = -1