HIVE面试题
HIVE 优化:
场景1. 分组聚合group by 导致数据倾斜 -- map端聚合 :
aggr=true
- 会在mapper端先group by一次,最后再把结果merge起来,为了减少reducer处理的数据量
- 指令: Set hive.groupby.mapaggr.checkinterval=1000000
Set hive.map.aggr = true
set hive.groupby.skewindata=true; --启用分组聚合数据倾斜优化
场景2. 大表和小表join 导致的数据倾斜. 将小表广播到内存中不进行shuffle
--启用map join自动转换
set hive.auto.convert.join=true;
场景3. 两张大表 join 发生数据倾斜[SMB JOIN]
使用分桶表,并且开启SMB Join (Sort Merge Bucket Join)
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
关联键空值很多情况
SELECT ...
FROM (
SELECT *
FROM tbl1
WHERE ds = '${cur_date}'
) a
LEFT OUTER JOIN (
SELECT *
FROM tbl1
WHERE ds = '${cur_date}'
) b
ON coalesce(a.id,rand() * 9999) = b.id -- 通过coalesce对空值进行随机分发,避免聚集
场景4. 小文件合并优化
合并Map端输入的小文件,是指将多个小文件划分到一个切片中,进而由一个Map Task去处理。目的是防止为单个小文件启动一个Map Task,浪费计算资源。
--可将多个小文件切片,合并为一个切片,进而由一个map任务处理
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;