数据倾斜导致的后果,一般是 OOM 或者 速度异常慢
一、数据倾斜基本形态特征、表现
- 数据分布不均匀,个别 Task 处理大量数据,造成热点数据问题
- 大部分 Task 都执行特别快,剩下几个 Task 执行特别慢,超过平均时间好几倍,很明显就是数据倾斜
- Spark 任务好好的,突然有一天发生了 OOM
- 其他 Task 都执行完了,没什么特别的问题,但是有的 Task 会突然报一个 OOM、Task failed、Task lost、Resubmitting Task,反复执行几次都跑不通,最后挂掉
- 或者某个 Task 直接 OOM
二、数据倾斜的定位
- Web UI( job/stage/task ),可以清晰看见哪个 Task 运行的数据量大小
- Log,可以清晰告诉你哪一行出现 OOM,同时看到具体哪个 Stage 出现了数据倾斜(一般是在 Shuffle 过程中产生)
- 也可能发现绝大多数 Task 非常快,但是个别 Task 非常慢
- 代码走读,重点看 distinct、join、groupByKey、reduceByKey、aggregateByKey、repartition 等关键代码
- 对数据特征分布进行分析
三、数据倾斜原理
- 在 Shuffle 的时候,必须将各个节点相同的 Key 拉到某一个节点进行 Task 的处理
- 比如 join、group by,如果某个 Key 对应的数据量非常大,那么必然这个 key 对应的数据进行处理的时候就会产生数据倾斜
- 归根到底就是 Key 分布不均匀问题
四、Stage 划分
- 划分依赖
- Stage 划分的依据是宽依赖,reduceByKey、groupByKey 等算子会导致宽依赖的产生
- 核心算法
- Spark 会从触发 Action 操作的那个 RDD 开始往回推,如果发现某个 RDD 是宽依赖,就为这个 RDD 创建新的 Stage,这个 RDD 就是新 Stage 的最后一个 RDD
- Task 任务集
- 有一组关联的、相互之间没有 Shuffle 依赖关系的任务所组成的任务集
- 一个 Stage 创建一个 TaskSet,为 Stage 的每个 RDD 分区创建一个 Task,多个 Task 封装成 TaskSet
- Task 任务被送到某个 Executor 上的工作任务,单分区数据集上的最小处理流程单元

最低0.47元/天 解锁文章
2945

被折叠的 条评论
为什么被折叠?



