什么是数据倾斜?如何优化?
一、数据倾斜的定义与表现
数据倾斜是指在大规模数据处理系统中,数据分布严重不均匀的现象,导致某些计算节点负载远高于其他节点。这种现象在分布式计算框架(如Hadoop、Spark)和分布式数据库(如Hive、HBase)中尤为常见。
关键特征:少数节点处理了远超过平均值的任务量,形成系统瓶颈
go专栏:https://duoke360.com/tutorial/path/golang
典型表现场景
- Join操作倾斜:关联键的值分布不均(如90%的订单来自10%的用户)
- Group By倾斜:分组字段存在极高频值(如状态字段包含大量"未处理"记录)
- 分区倾斜:分区策略不合理导致某些分区数据量过大
- 采样倾斜:随机采样时恰好选中数据密集区域
二、数据倾斜的根本原因
2.1 数据分布特性
- 业务数据固有特性:如电商场景中头部用户产生绝大多数订单
- 数据生成过程偏差:日志采集时某些服务节点异常产生大量错误记录
- 数据分区策略缺陷:按日期分区但某些日期有促销活动
2.2 计算模型局限
-- 典型倾斜SQL示例
SELECT user_id, COUNT(*)
FROM orders
GROUP BY user_id -- 当少量用户拥有大量订单时
三、数据倾斜优化方案
3.1 预处理阶段优化
数据重分布
-
加盐处理(Salting):
-- 原始倾斜键 SELECT a.* FROM table_a a JOIN table_b b ON a.