hive性能优化
一、Map阶段的优化:
(控制hive任务中的map数,确定合适的map数,以及每个map处理合适的数据量)。
map个数影响因子:
- input目录中文件总个数;
- input目录中每个文件大小;
- 集群设置的文件块大小(默认为128M, 可在hive中通过set dfs.block.size;命令查看,不能在hive中自定义修改);
举例:
input目录中有1个文件(300M),会产生3个块(2个128M,1个44M)即3个Map数。
input目录中有3个文件(5M,10M,200M),会产生4个块(5M,10M,128M,72M)即4个Map数。
适当减少Map数:
当一个任务有很多小文件(远远小于块大小128m),会产生很多Map,而一个Map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费,而且同时可执行的map数是受限的。
set mapred.max.split.size=100000000;//(100M)
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;//表示执行前进行小文件合并。
//大于128:按照128M分割;100~128按照100分;小于100的进行合并。
适当增加Map数:
当有一个小于128M的文件(其中有上千万的数据,字段少并且数据单位小),如果map处理的逻辑比较复杂,用一个map任务去做,耗时比较大。
set mapred.reduce.tasks=10;
create table a_1 as
select * from a distribute by rand();
//表示通过设置Map任务数来中加Map,把a表中的数据均匀的放到a_1目录下10个文件中。
Map端聚合:
set hive.map.aggr=true ;(默认为true)
二、Reduce阶段的优化:
2.1 指定reduce数量
set mapred.reduce.tasks=10
2.2未指定reduce数量
param1:hive.exec.reducers.bytes.per.reducer(默认为1000^3)
param2:hive.exec.reducers.max(默认为999)
reduceNum = min(param2,总输入数据量/param1(reduceNum = InputFileSize / bytes per reducer))
通常情况下,有必要手动指定reducer个数。考