Hive优化总结


1.小表大表join(MapJOIN):使用map join 让小的维度表先进内存,在map端完成join

set hive.auto.convert.join = true; 默认为true

set hive.mapjoin.smalltable.filesize=25000000;默认25M以下是小表

2.大表join大表:

(1)空key过滤:一般业务场景不常用

(2)空key转换:nvl(n.id,rand()) = o.id; 将空key转为随机值,进不同的reducer

(3)SMB:分桶 桶的个数不要超过可用CPU的核数

clustered by(id)  ---建表条件

sorted by(id)

into 6 buckets

set hive.optimize.bucketmapjoin = true;

set hive.optimize.bucketmapjoin.sortedmerge = true;

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

3.Group By:很多操作可用先在Map端进行部分聚合

开启Map端聚合参数设置

set hive.map.aggr = true; 开启在Map端进行聚合。默认为True

set hive.groupby.mapaggr.checkinterval = 100000; Map端进行聚合操作的条目数目

set hive.groupby.skewindata = true; 有数据倾斜的时候进行负载均衡(默认是false)

4.Count(Distinct) 去重统计:distinct 只用一个Reduce Task来完成。可用group by来替代去重操作

5.避免笛卡尔积

hive.strict.checks.cartesian.product

6.行列过滤:尽量不要select *。优化子查询,先过滤再关联

7.设置分区

8.设置分桶

9.合理设置Map和Reduce数目

合理设置Map数目

(1)computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M公式,调整maxSize最大值。让maxSize最大值低于blocksize就可以增加map的个数。

(2)小文件进行合并

在map-only任务结束时合并小文件,默认true

SET hive.merge.mapfiles = true;

在map-reduce任务结束时合并小文件,默认false

SET hive.merge.mapredfiles = true;

合并文件的大小,默认256M

SET hive.merge.size.per.task = 268435456;

当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

SET hive.merge.smallfiles.avgsize = 16777216;

合理设置Reduce个数

(1)每个Reduce处理的数据量默认是256MB

hive.exec.reducers.bytes.per.reducer=256000000

(2)每个任务最大的reduce数,默认为1009

hive.exec.reducers.max=1009

(3)计算reducer数的公式

N=min(参数2,总输入数据量/参数1)

10.并行执行

set hive.exec.parallel=true;//打开任务并行执行

set hive.exec.parallel.thread.number=16;  //同一个sql允许最大并行度,默认为8。

你可能感兴趣的:(Hive优化总结)