1 数据倾斜
- 绝大部分任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败,这样的现象为数据倾斜现象。
- 将数据倾斜分为单表携带了 GroupBy 字段的查询和两表(或者多表)Join 的查询。
1.1 单表数据倾斜优化
1.1.1 Map 端进行聚合 - GroupBy 操作同时聚合函数为 count 或者 sum
set hive.map.aggr = true;
set hive.groupby.mapaggr.checkinterval = 100000;
set hive.groupby.skewindata = true;
1.1.2 增加 Reduce 数量(多个 Key 同时导致数据倾斜)
方法1:
set hive.exec.reducers.bytes.per.reducer = 256000000
set hive.exec.reducers.max = 1009
计算 reducer 数的公式
N=min(参数 2,总输入数据量/参数 1)(参数 2 指的是上面的 1009,参数 1 值得是 256M)
方法2:
set mapreduce.job.reduces = 15;
1.2 多表Join 数据倾斜优化
1.2.1 拆分倾斜key
set hive.skewjoin.key=100000;
set hive.optimize.skewjoin=false;
如果开启了,在 Join 过程中 Hive 会将计数超过阈值 hive.skewjoin.key(默认 100000)的倾斜 key 对应的行临时写进文件中,然后再启动另一个 job 做 map join 生成结果。通hive.skewjoin.mapjoin.map.tasks 参数还可以控制第二个 job 的 mapper 数量,默认 10000。
set hive.skewjoin.mapjoin.map.tasks=10000;
1.2.2 MapJoin
- MapJoin 是将 Join 双方比较小的表直接分发到各个 Map 进程的内存中,在 Map 进程中进行 Join 操作,这样就不用进行 Reduce 步骤,从而提高了速度。
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=25000000;
2 大数据量性能优化
2.1 分区表
- Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。
- 分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
- 分区表加载数据时,必须指定分区
- 在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区
- 创建二级分区
hive (