微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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的粒度(可能会减小数据倾斜的可能性,但是某些场景下不适用)
  • 过滤导致倾斜的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的使用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐