hive学习之三:项目中的hive优化实践

1.小表放入内存,在map端join,并不是所有聚合操作都在reducer端操作,慎重使用mapjoin,一般行数小于2000行,大小小于1M
2.hive.groupby.skewindata变量从上面groupby语句可以看出,这个变量是用于控制负载均衡的。当数据出现倾斜时,如果该变量设置为true,那么Hive会自动进行负载均衡。当该变量设为
  true时候,不可以使用distinct关键字对多列联合去重
3.合并小文件
   hive.merge.mapfiles = true是否和并 Map 输出文件,默认为 True
   hive.merge.mapredfiles = false是否合并 Reduce 输出文件,默认为 False
   hive.merge.size.per.task = 256*1000*1000合并文件的大小。
4.Order by 实现全局排序,一个reduce实现,效率低
  Sort by 实现部分有序,单个reduce输出的结果是有序的,效率高,通常和DISTRIBUTE BY关键字一起使用(DISTRIBUTE BY关键字 可以指定map 到 reduce端的分发key)
  CLUSTER BY col1 等价于DISTRIBUTE BY col1 SORT BY col1.
  distinct把所有数据发送到一个reducer上,数据倾斜严重。特别是count(distinct field1)使用group by代替,设置多个reducer
5.SQL并行执行优化:
  set hive.exec.parallel=true;--任务并行执行
  set hive.exec.parallel.thread.number=16;--并行执行的线程数量
  set hive.groupby.skewindata=true;--防止数据倾斜
  set mapred.reduce.tasks=60;--设置任务执行的reduce数量
  set hive.auto.convert.join=false;--是否自动将common join转换为map join
  set hive.ignore.mapjoin.hint=false;--打印mapjoin
  set hive.exec.compress.intermediate=true; --中间结果压缩
  set hive.execution.engine=tez;--更改hive底层执行的计算框架                             
  set hive.exec.reducers.max=200;--任务最大的reduce数量(默认999)
  set hive.map.aggr = true;--map端做聚合(默认true)
 
  -----map数量控制---------------------
  set mapred.max.split.size=100000000;--超过100m不足128M切分
  set mapred.min.split.size.per.node=100000000;--超过100m,切分
  set mapred.min.split.size.per.rack=100000000;--超过100m,切分
  set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
  -----reduce数量控制-----------------
  set hive.exec.reducers.bytes.per.reducer=500000000;--每个reduce任务执行的数据量,默认1G。
6.只有一个reduce的场景:
  a、没有group by 的汇总
  b、order by
  c、笛卡尔积

7.写SQL要先了解数据本身的特点,如果有join ,group操作的话,要注意是否会有数据倾斜,如果出现数据倾斜,应当做如下处理:
set hive.exec.reducers.max=200;
set mapred.reduce.tasks= 200;---增大Reduce个数
set hive.groupby.mapaggr.checkinterval=100000 ;--这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.groupby.skewindata=true; --如果是group by过程出现倾斜 应该设置为true
set hive.skewjoin.key=100000; --这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.optimize.skewjoin=true;--如果是join 过程出现倾斜 应该设置为true

7.文件压缩,看HQL是IO密集型的任务还是CPU密集型的任务,通常更高的压缩比带来更多的解压缩CPU消耗,但能够减小MR传输的数据量降低磁盘空间和IO操作。
  相反,压缩比低,解压缩快MR执行跟快。
 
8.SQL执行顺序:
(8)SELECT (9)DISTINCT  (11)