spark 优化之详尽概述


前言

  • spark性能调优
  • spark数据倾斜
  • spark故障排除

一、spark性能调优

1.常规性能调优

  • 最优资源配置
  • RDD优化
    • RDD复用
    • RDD持久化
    • RDD尽可能早的filter操作
  • 并行度调节
  • 广播变量
  • Kryo序列化
  • 调节本地化等待时长

2.算子调优

  • mapPartitions
  • foreachPartition优化数据库操作
  • filter与coalesce的配合使用
  • repartition解决SparkSQL低并行度问题
  • reduceByKey预聚合

3.Shuffle调优

  • 调节map端缓冲区大小
  • 调节reduce端拉取数据缓冲区大小
  • 调节reduce端拉取数据重试次数
  • 调节reduce端拉取数据等待间隔
  • 调节SortShuffle排序操作阈值

4.JVM调优

  • 降低cache操作的内存占比
  • 调节Executor堆外内存
  • 调节连续等待时长

二、spark数据倾斜

spark数据倾斜问题主要是指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题。要注意区分数据倾斜和数据量过大的情况:数据倾斜是指少数的task被分配了绝大多数数据;数据过量是指所有的task被分配的数据量都很大。

1.数据倾斜的表现:

  • Spark作业的大部分task都执行迅速,只有有限的几个task执行的非常慢,此时可能出现了数据倾斜
  • Spark作业的大部分task都执行迅速,但是有的task在运行过程中会突然报出OOM,反复执行几次都在某一个task报出OOM错误,此时可能出现了数据倾斜

2.定位数据倾斜:

  • 查阅代码中的shuffle算子,根据代码逻辑判断此处是否会出现数据倾斜
  • 查看Spark作业的log文件,log文件对于错误的记录会精确到代码的某一行,可以根据异常定位到的代码位置来判定错误发生在第几个stage,对应的shuffle算子是哪一个。

3.解决数据倾斜方案:

  • 聚合原数据
    • 避免shuffle过程
    • 增大key的粒度(可能会减小数据倾斜的可能性,增大每个task的数据量,但是某些场景下不适用)
    • 缩小key的粒度(可能会增大数据倾斜的可能性,降低每个task的数据量)
  • 过滤导致倾斜的key
  • 提高shuffle操作中的reduce并行度
  • 使用随机key实现双重聚合
  • 将reduce join转换成map join
  • sample采样对倾斜key单独进行join
  • 使用随机数扩容进行join

三、spark故障排除

  • 控制reduce端缓冲区大小以避免OOM
  • JVM GC导致的shuffle文件拉取失败
  • 解决各种序列化导致的报错
    • 作为RDD的元素类型的自定义类,必须是可序列化的
    • 算子函数里可以使用的外部的自定义变量,必须是可序列化的
    • 不可以在RDD的元素类型、算子函数里使用第三方的不支持序列化的类型,例如Connection
  • 解决算子函数返回NULL导致的问题
    • 某些算子函数需要返回值,但是我们并不需要,可以这样解决:返回特殊值,例如-1;在通过算子获取了一个RDD之后,可以对这个RDD执行filter操作,将数值为-1的数据给过滤掉;在使用完filter算子后,继续调用coalesce算子进行优化。
  • 解决YARN-CLIENT模式导致的网卡流量激增问题
  • 解决YARN-CLUSTER模式的JVM栈内存溢出无法执行的问题
  • 解决SparkSQL导致的JVM栈内存溢出
  • 持久化与checkpoint的使用
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值