3.控制hive map reduce个数
参考:
https://blog.csdn.net/wuliusir/article/details/45010129
https://blog.csdn.net/zhong_han_jun/article/details/50814246
1.split的计算方式:
splitsize = max(splitsize,min(blocksize,filesize/NUMmaps))
NUMmaps即为默认的map数,默认为1,也就是说最大的splitsize为文件的大小。
2.不同的hive.input.format时map个数
hive 的split size在使用不同的input format时依赖的参数不同。
- hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
此时由以下三个参数控制
mapred.max.split.size #控制最大split
mapred.min.split.size.per.node #控制最小split,优先级低
mapred.min.split.size.per.rack #控制最小split,优先级高
- hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat
此时由
mapred.min.split.size
mapred.map.tasks #可以忽略,默认为1
在做split时,不如一个split的数据也会放到一个map执行,如果splitsize 128m,文件150m,则会有两个map,一个128m,另外一个22m,这样两个map执行的时间就不一样了
注意
把mapred.min.split.size\mapred.min.split.size.per.node 从128M增加到256M,可能并不会降低map数,这时需要增大数值,一边增加一边测试
3.reduce个数
reduce可以通过设置set mapred.reduce.tasks=100
来指定个数,或者指定reduce计算的数据,set hive.exec.reducers.bytes.per.reducer=1073741824
以下是个样例:
set mapred.max.split.size=1024000000;
set mapred.min.split.size.per.node=512000000;
set mapred.min.split.size.per.rack=512000000;
set mapreduce.task.io.sort.mb=200;
set hive.exec.parallel.thread.number=1 ;
set mapred.reduce.tasks = 314;
set mapreduce.map.memory.mb=1024;
set mapreduce.task.io.sort.factor=50;