首先hive本质就是mapreduce,那么优化就从mapreduce开始入手。
然而mapreduce的执行快慢又和map和reduce的个数有关,所以我们先从这里下手,调整并发度。
关于map的优化:
1.调整block
作业会通过input的目录产生一个或者多个map任务。set dfs.block.size
因为没份数据都是block,而block的大小直接影响了split切分的分数,如果切分的更细一点,那么split个数会增加,那直接会影响map的增加,所以blocksize是直接影响并发度的因素
通过该配置参数来调整map个数:
set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
还可以直接设置map个数:
set mapred.map.tasks=10;
注:这种方式进行设置,并不一定会生效
开启combiners
Map端聚合 hive.map.aggr=true
注:用的好了,可以提高性能,用的不好了,反而影响结果(可以参考mapreduce的combiner)
关于reduce的优化:
hive.exec.reducers.bytes.per.reducer;reduce任务处理的数据量
这个参数可以在提交sql的时候设置这个参数,这个参数可以直接设置一个数字,这个数字会直接影响reduce的个数
reduce个数的计算公式(hive.exec.reducers.bytes.per.reducer):
reduce个数 = InputFileSize / bytes pre reduce(整个数据的大小 / 每一个reduce可以处理的大小)
hive.exec.reducers.bytes.per.reducer这个参数设置的就是每个reduce可以处理的大小
set mapred.reduce.tasks=10(也是设置reduce的个数)
如果hive.exec.reducers.bytes.per.reducer和set mapred.reduce.tasks同时设置了,set mapred.reduce.tasks 优先级高
-------------------------