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。