Spark 调优:数据倾斜解决方案、Shuffle、Stage

    数据倾斜导致的后果,一般是 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 上的工作任务,单分区数据集上的最小处理流程单元

五、Spark Shuffle

5.1 什么是 Shuffle

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值