本文最后更新于 2024-03-03,文章内容可能已经过时。

一、数据倾斜的定义

数据倾斜是指在分布式计算环境中,部分数据集中到了少数节点上,导致这些节点的计算负载远高于其他节点,从而影响整个计算任务的执行效率。

二、数据倾斜的表现

  • 在 MapReduce 任务中,Reduce 阶段卡在 99.99%;

  • 出现多个 Reduce 任务卡住;

  • 容器报错,如内存溢出;

  • 读写数据量巨大,远超过其他正常的 Reduce;

  • 伴随着数据倾斜的表现,任务被异常终止等。

三、数据倾斜的原因

数据倾斜的原因主要包括:

  • 数据分布不均匀,某些数据集中到少数节点;

  • 业务数据特性,如某个区域或部分数据的突然增长;

  • SQL 查询本身存在倾斜问题。

四、触发数据倾斜的 SQL 操作

  • count(distinct) 操作;

  • Join 操作。

五、数据倾斜的解决方案

  1. 参数调整

    • 提高 Shuffle 并行度:通过增加 Shuffle 并行度,可以将原本集中在少数节点的数据分散到更多的节点上,从而减轻单个节点的负载压力,缓解数据倾斜问题。

  2. Map 端聚合

    • 在 Map 端进行部分聚合操作,可以减少数据传输量和 Reduce 端的压力,从而缓解数据倾斜。

  3. Reduce Join 改为 Map Join

    • 将 Reduce Join 操作改为 Map Join,即在 Map 阶段完成 Join 操作,避免了数据传输和 Shuffle 阶段的压力,有助于缓解数据倾斜。

  4. 开启 Skewed Join

    • 通过开启 Skewed Join,在任务运行时检测数据倾斜的情况,并对倾斜的数据采取特殊处理,如使用 Map Join 等方式,有助于提高任务的执行效率。

  5. SQL 优化

    • 优化 count(distinct) 操作:通过对 count(distinct) 操作进行优化,如使用两阶段聚合等方式,减少计算量,提高执行效率。

    • 优化 Join 操作:针对 Join 操作可能出现的数据倾斜问题,可以采用随机前缀和 RDD 扩容等方式,优化 Join 操作的执行效率。