如何解决数据倾斜问题
背景
分布式环境下经常会碰到数据倾斜的问题,因为实际业务中的数据很难均匀分布,有些数据中会存在大量重复的 key ,例如某个 ID 的用户活跃行为特别频繁,某个时间段系统在线的用户人数特别多等等。
在具体任务中,导致数据倾斜的操作主要是发生在 group by、join 等需要数据shuffle的操作中,这些过程需要根据 key 进行数据汇集处理,其中容易卡住的往往是 join 操作。当某个或者某些 key 的数据量远大于其他 key 时,处理这些 key 的任务运行时间也远大于其他任务,从而拖累整个任务时长。
数据倾斜的问题不解决好的话,不仅没办法充分利用分布式带来的数据处理优势,而且还可能导致内存消耗过大,超负荷导致任务延迟或者失败。本文将结合在日常工作中碰到的导致数据倾斜的问题进行拆解,追溯问题出现的源头,更好地预防与解决数据倾斜问题。
1、事前对连接 key 进行预处理
不要着眼于问题出现之后再找应对方案,可以换个思路,在事前先避免数据倾斜问题的发生。
我们一般的思维惯性是碰到问题再找解决方案,但碰多了数据倾斜会发现,大多的数据倾斜都是跟业务无光的数据导致的。我们能在读表之后第一件事就是尽可能的过滤不必要的数据,理清业务含义先过滤脏数据和业务不相关的数据。
过滤的数据具体可以分为以下两种情况:
(1)两个表连接 key 存在大量的 NULL 数据没有过滤,参与进了 join 的执行。其中