maptask个数取决于:split逻辑切片的个数有关, 在mapreduce中,split逻辑切片和表中文件大小和文件个数、blockSize等参数有关。
hive底层读取表默认使用的是CombineHiveInputFormat,会对小文件进行合并,
CombineHiveInputFormat底层逻辑切片计算的过程如下:
1. 如果文件大小大于split.maxsize的2倍,则形成一个独立的逻辑切片
2. 如果文件大小大于split.maxsize,但是小于split.maxsize的2倍,则拆分成两个平均大小的虚拟存储
3. 如果文件大小小于split.maxsize,则形成一个虚拟存储
4. 判断虚拟存储的文件大小是否大于split.maxSize,如果大于等于则形成一个逻辑切片 如果虚拟存储的文件大小小于split.maxSize,则和下一个虚拟文件进行合并,直到大于split.maxsize,共同形成一个切片。
例如有三个文件大小,当参数设置为4M时
set mapreduce.input.fileinputformat.split.maxsize=4M
文件切分情况:
文件1:2M
文件2:6M [3M + 3M]
文件3:9M [4M + 2.5M + 2.5M ]
reduceTask个数取决于自己设置的参数值set mapreduce.job.reduces
set mapreduce.job.reduces=3
当参数set mapreduce.job.reduces=-1时
根据此公式进行选择 N=min(参数2,总输入数据量/参数1)
参数1:
每个Reduce处理的数据量默认是256MB
set hive.exec.reducers.bytes.per.reducer=256000000
参数2:
每个任务最大的reduce数,默认为1009
set hive.exec.reducers.max=1009
举例:假如数据量是512M 默认启动: 512/256= 2