hive优化总结

1、列裁剪、分区裁剪

只查询需要的字段和分区,不使用select*

2、join优化

小表放左边

3、空值处理

(1)NULL 和数字相加的问题 ,为避免这种情况先 nvl  或者 coalesce  先处理

(2)NULL 值关联时,可排除掉不参与关联,也可随机分散开避免倾斜

4.    排序优化

  1. 不需要全局排序时,可用distribute by sort by  而不用order  by

5.    去重优化

  1. 根据实际需要,用group by 替换distinct 
  2. 多次用到的子查询,可以单独拎出来存入临时表或者变量中以备后续使用

6.    多维度

涉及到多个维度统计数据的,用grouping set 代替多个union all

7.    参数优化

  1、合理设置reduce个数,

set mapred.reduce.tasks=200; 这个最好不设置,数据量会变化

set mapred.max.split.size=536870912;
set mapred.min.split.size.per.node=536870912;
set mapred.min.split.size.per.rack=536870912; 
set hive.exec.reducers.bytes.per.reducer=536870912;
set hive.merge.mapfiles = true;
set hive.merge.mapredfiles = true  
set hive.merge.size.per.task = 536870912;
set hive.merge.smallfiles.avgsize=536870912; 会再起一个job 合并小文件


  1. 设计并行。控制同一个sql可以运行的job的最大值

set hive.exec.parallel=true;

set hive.exec.parallel.thread.number=8; 值可选

  1. 大量的小文件导致文件数目过多,给HDFS带来压力,对hive处理的效率影响比较大,可以合并mapreduce产生的文件

set hive.merge.mapfiles = true   是否和并 Map 输出文件,默认为 True
set hive.merge.mapredfiles = false  
是否合并 Reduce 输出文件,默认为 False
set hive.merge.size.per.task = 256*1000*1000  
合并文件的大小

  4、内存调整

set mapreduce.map.memory.mb=4096;
set mapreduce.reduce.memory.mb=8192;
set mapreduce.map.java.opts=-Xmx3072m;
set mapreduce.reduce.java.opts=-Xmx6144m;





你可能感兴趣的:(Hive)