数据倾斜
本文最后更新于 2024-03-03,文章内容可能已经过时。
一、数据倾斜的定义
数据倾斜是指在分布式计算环境中,部分数据集中到了少数节点上,导致这些节点的计算负载远高于其他节点,从而影响整个计算任务的执行效率。
二、数据倾斜的表现
在 MapReduce 任务中,Reduce 阶段卡在 99.99%;
出现多个 Reduce 任务卡住;
容器报错,如内存溢出;
读写数据量巨大,远超过其他正常的 Reduce;
伴随着数据倾斜的表现,任务被异常终止等。
三、数据倾斜的原因
数据倾斜的原因主要包括:
数据分布不均匀,某些数据集中到少数节点;
业务数据特性,如某个区域或部分数据的突然增长;
SQL 查询本身存在倾斜问题。
四、触发数据倾斜的 SQL 操作
count(distinct) 操作;
Join 操作。
五、数据倾斜的解决方案
参数调整:
提高 Shuffle 并行度:通过增加 Shuffle 并行度,可以将原本集中在少数节点的数据分散到更多的节点上,从而减轻单个节点的负载压力,缓解数据倾斜问题。
Map 端聚合:
在 Map 端进行部分聚合操作,可以减少数据传输量和 Reduce 端的压力,从而缓解数据倾斜。
Reduce Join 改为 Map Join:
将 Reduce Join 操作改为 Map Join,即在 Map 阶段完成 Join 操作,避免了数据传输和 Shuffle 阶段的压力,有助于缓解数据倾斜。
开启 Skewed Join:
通过开启 Skewed Join,在任务运行时检测数据倾斜的情况,并对倾斜的数据采取特殊处理,如使用 Map Join 等方式,有助于提高任务的执行效率。
SQL 优化:
优化 count(distinct) 操作:通过对 count(distinct) 操作进行优化,如使用两阶段聚合等方式,减少计算量,提高执行效率。
优化 Join 操作:针对 Join 操作可能出现的数据倾斜问题,可以采用随机前缀和 RDD 扩容等方式,优化 Join 操作的执行效率。