Hive优化(4)——数据倾斜优化

一、数据倾斜优化

        数据倾斜是指在数据处理或计算过程中,某些数据分布不均匀,导致部分计算节点负载过重,从而影响整体计算性能。针对数据倾斜进行优化可以提高计算效率和资源利用率。以下是一些常见的数据倾斜优化策略:

  1. 数据预处理:在数据加载或处理之前,对数据进行预处理,通过数据采样、数据分桶等方法,尽量均匀地分布数据,减少倾斜的可能性。

  2. 数据分片:将数据按照某种规则或算法进行分片,使得每个分片中的数据量相对均匀,降低数据倾斜的程度。

  3. 使用合适的数据结构:选择合适的数据结构,如哈希表、树结构等,可以减少数据倾斜对计算性能的影响。例如,使用哈希分区可以将数据均匀地分布到不同的节点上。

  4. 增加分区数量:增加数据分区的数量,将数据更细粒度地分布到不同的计算节点上,减少单个节点的负载压力。

  5. 动态负载均衡:监控计算节点的负载情况,动态调整数据分布或任务分配,使得计算负载更加均衡。

  6. 聚合操作优化:在进行聚合操作时,可以考虑先进行局部聚合,然后再进行全局聚合,减少数据倾斜对全局聚合的影响。

  7. 使用压缩算法:对倾斜的数据进行压缩,减少数据传输的成本,提高计算效率。

  8. 调整计算逻辑:重新设计计算逻辑,避免或减少数据倾斜的发生,例如使用随机化算法等。

二、优化方案

2.1、join造成数据倾斜

2.1.1.方案一:

参考文章(三)里的join优化方法即可

http://t.csdnimg.cn/16dGp

2.1.2.方案二:

        将那些产生倾斜的key和对应v2的数据, 从当前这个MR中移出去, 单独找一个MR来处理即可, 处理后, 和之前的MR进行汇总结果即可 。       

  • 运行期间

运行期处理方案:

思路: 在执行MR的时候, 会动态统计每一个 k2的值出现重复的次数, 当这个重复的次数达到一定的阈值后, 认为当前这个k2的数据存在数据倾斜, 自动将其剔除, 交由给一个单独的MR来处理即可,两个MR处理完成后, 将结果基于union all 合并在一起即可

实操:

-- 开启运行期处理倾斜参数
set hive.optimize.skewjoin=true; 
-- 阈值, 此参数在实际生产环境中, 需要调整在一个合理的值(否则极易导致大量的key都是倾斜的)
set hive.skewjoin.key=100000; 10万

判断依据: 查看 join的 字段 对应重复的数量有多少个, 然后选择一个合理值

比如判断:

id为 1 大概有 100w id为 2 88w id 为 3 大概有 500w 设置阈值为 大于500w次数据

或者: 总数量大量1000w, 然后共有 1000个班级, 平均下来每个班级数量大概在 1w条, 设置阈值: 大于3w条 ~5w条范围 (超过3~5倍才认为倾斜)

110万 50个 2.2万 6.6万-11万

select * from tb1 join tb2 on tb1.store_no= tb2.store_no

适用于: 并不清楚那个key容易产生倾斜, 此时交由系统来动态检测

  • 编译期间

思路: 在创建这个表的时候, 我们就可以预知到后续插入到这个表中数据, 那些key的值会产生倾斜, 在建表的时候, 将其提前配置设置好即可, 在后续运行的时候, 程序会自动将设置的key的数据单独找一个MR来进行处理即可, 处理完成后, 再和原有结果进行union all 合并操作

实操:

set hive.optimize.skewjoin.compiletime=true; -- 开启编译期处理倾斜参数
​
CREATE TABLE list_bucket_single(
 id int, 
 value STRING
)
-- 倾斜的字段和需要拆分的key值
SKEWED BY (id) ON (1,5,6)
-- 为倾斜值创建子目录单独存放
STORED AS DIRECTORIES;

适用于: 提前知道那些key存在倾斜

2.2、group by造成数据倾斜

由group by 造成的数据倾斜。相同分组的数据会放入同一个reduce处理

2.2.1.方案一

基于MR的 combiner(规约, 提前聚合) 减少数据达到reduce数量, 从而减轻倾斜问题

只需要在HIVE中开启combiner提前聚合配置参数即可:

set hive.map.aggr=true;

2.1.2.方案二

负载均衡的解决方案(需要运行两个MR来处理) (大combiner方案)

只需要开启负载均衡的HIVE参数配置即可:

set hive.groupby.skewindata=true;

如果分组的字段对应的数据较多,建议使用负载的方案

group by city

2.1.3.其他方式

  1. 使用更均匀的分区键:确保GROUP BY操作所用的分区键是尽可能均匀分布数据的。例如,选择具有高基数(cardinality)的列作为分区键,或者使用哈希函数将数据均匀地分布到不同的分区。

  2. 预聚合:在进行GROUP BY操作之前,可以尝试进行预聚合操作,将数据按照一定规则进行局部聚合,减少每个节点上需要处理的数据量。例如,在Map阶段进行局部聚合,然后再在Reduce阶段进行全局聚合。

  3. 数据重分布:在数据倾斜发生后,可以尝试将数据重新分配到不同的节点上,以使数据更均匀地分布。这可以通过重新选择分区键、对倾斜数据进行拆分或合并等方式来实现。

  4. 采用自适应调整策略:实时监控数据分布情况,当检测到数据倾斜时,采取自适应调整策略,如动态调整分区数量、重新分配任务等,以减少倾斜影响。

  5. 使用采样:在执行GROUP BY操作之前,对数据进行采样,并根据采样结果来选择合适的分区键,以降低数据倾斜的可能性。

  6. 优化查询计划:对查询计划进行优化,尽量减少数据倾斜发生的可能性。例如,避免在倾斜键上进行连接操作,尽量将GROUP BY操作放在数据倾斜较小的字段上进行等。

  7. 使用分布式计算框架的内置优化功能:许多分布式计算框架(如Spark、Hadoop等)提供了针对数据倾斜问题的内置优化功能,可以通过配置参数或使用相关API来实现优化。

  • 50
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值