赞
踩
使用场景:如果大表和大表进行join操作,则可采用skewjoin(倾斜关联来开启对倾斜数据的优化)
- skewjoin原理:
- 1. 对于skewjoin.key,在执行job时,将它们存入临时的HDFS目录,其它数据正常执行
- 2. 对倾斜数据开启map join操作(多个map并行处理),对非倾斜值采取普通join操作
- 3. 将倾斜数据集和非倾斜数据集进行合并Union操作。
上面的配置项其实应该理解为hive.optimize.skewjoin.runtime,也就是sql运行时来对倾斜信息进行优化;除此之外还有另外一个配置:
set hive.optimize.skewjoin.compiletime=true; #默认关闭。
此参数的用处和上面的hive.optimize.skewjoin一致,但在编译sql时就已经将执行计划优化完毕。但要注意的是,只有在表的元数据中存储的有数据倾斜信息时,才能生效。因此建议runtime和compiletime都设置为true。
可以通过建表语句来指定数据倾斜元数据:
- CREATE TABLE list_bucket_single (key STRING, value STRING)
- -- 倾斜的字段和需要拆分的key值
- SKEWED BY (key) ON (1,5,6)
- -- 为倾斜值创建子目录单独存放
- [STORED AS DIRECTORIES];
应用了表连接倾斜优化以后,会在执行计划中插入一个新的union操作,此时建议开启对union的优化配置
- -- 默认关闭
- set hive.optimize.union.remove=true;
此配置项减少对Union all子查询中间结果的二次读写,可以避免union输出的额外扫描过程,当开启了skewjoin时尤其有用,建议同时开启
- set hive.optimize.skewjoin=true;
- set hive.optimize.skewjoin.compiletime=true;
- set hive.optimize.union.remove=true;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。