数据倾斜

某些分区键对应的数据量与流量远大于其他分区:表现为个别实例 CPU 或存储显著偏高、任务出现长尾;需要重新选择分布键或对热点加盐拆分。

识别对比各分片行数、吞吐与延迟分布,找明显偏差
加盐热点键追加随机后缀分散写入,读取时聚合
重选改用分布更均匀且仍贴合查询的分片键

加盐拆分示意

加盐拆分示意
原键:user_id=42 → shard = 42 % 16 → 单分片热点
加盐:key = '42#' + rand(0..3) → 写入分散到 4 个分片

读取:并发读 4 个盐值分片后合并
统计:按原始 user_id 聚合,忽略后缀
注意:只对确认的热点键加盐,避免全量加盐
  • 识别:按分片统计行数、QPS 与延迟分布,找明显离群分片
  • 分类:键分布不均、单键热点与空值键,治理手段各不相同
  • 验证:治理后用同一统计口径复测,确认分片间差异收敛
倾斜治理要同时验证查询模式:加盐拆分后按原键查询需要合并多份数据。

易错点

  • 按取值不均的字段分片,长尾分片持续过载
  • 加盐后读取未合并,返回不完整数据

数据来源与参考

  • 《数据密集型应用系统设计》(Kleppmann)第 6 章
  • Apache Spark 文档:数据倾斜处理
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌