什么是数据倾斜?
数据倾斜(Data Skew)是指在分布式计算环境(如 Hive、Spark
)中,数据在不同分区或节点上分布不均衡,导致部分任务执行时间过长,从而影响整体作业的性能。例如,在进行 GROUP BY
或 JOIN
操作时,如果某些键的值过于集中,部分计算任务会比其他任务处理更多的数据,导致资源利用不均衡。
常见的数据倾斜处理方法:
方法 | 适用场景 | 优化思路 |
---|---|---|
预处理数据 | 某些 key 数据过于集中,导致单个任务负载过重 | 预先过滤异常大 key,或拆分热点 key |
增加 shuffle 并行度 |
reduce 任务执行时间过长 |
调整 mapreduce.job.reduces (Hive)或 spark.sql.shuffle.partitions (Spark) |
使用 SALTING 进行 key 拆分 |
GROUP BY 、JOIN 产生数据倾斜 |
在 key 后添加随机前缀,使数据分布更均匀 |
使用 MAP-SIDE JOIN (Hive) |
一张表小,另一张表大 | 让小表广播到所有计算节点,避免 shuffle |
使用 BROADCAST JOIN (Spark) |
Spark 计算时,一张表较小 | 使用 broadcast() 方法广播小表,减少 shuff |