一、Spark性能调优

1、常规性能调优

(1)最优资源配置:Executor数量、Executor内存大小、CPU核心数量&Driver内存

(2)RDD优化:RDD复用、RDD持久化(序列化、副本机制)、尽早地过滤

(3)并行度调节:各个stage的task的数量,应该设置为Spark作业总CPUcore数量的2~3倍

(4)广播大变量:每个Executor保存一个副本。初始只有一个副本,需要则从BlockManager上拉取,此Executor的所有task共用此广播变量,这让变量产生的副本数量大大减少

(5)Kryo序列化:比java的序列化性能高,

(6)调节本地化等待时长:valconf=newSparkConf().set("spark.locality.wait","6")

2、算子调优

(1)mapPartitions:针对一个分区的数据,建立一个数据库连接(数据量大容易OOM)

(2)foreachPartition优化数据库操作:将RDD的每个分区作为遍历对象,一次处理一整个分区的数据;但可能OOM

(3)filter与coalesce配合使用:filter操作之后,使用coalesce算子针对每个partition的数据量各不相同的情况,压缩partition的数量,而且让每个partition的数据量尽量均匀紧凑,

(4)repartition解决SparkSQL低并行度问题:使用repartition算子,去重新进行分区,避免了SparkSQL所在的stage只能用少量的task去处理大量数据并执行复杂的算法逻辑

(5)reduceByKey本地聚合:有map端聚合的特性,使得网络传输的数据量减小

3、Shuffle调优

(1)调节map端缓冲区大小:避免频繁的磁盘IO操作

(2)调节reduce端拉取数据缓冲区大小:增加拉取数据缓冲区的大小,可以减少拉取数据的次数

(3)调节reduce端拉取数据重试次数:避免由于JVM的fullgc或者网络不稳定等因素导致的数据拉取失败

(4)调节reduce端拉取数据等待间隔通过加大间隔时长(比如60s),以增加shuffle操作的稳定性。

(5)调节SortShuffle排序操作阈值:参数调大一些,大于shufflereadtask的数量,那么此时map-side就不会进行排序,减少性能开销

4、JVM调优

(1)降低cache操作的内存占比:可以通过spark.storage.memoryFraction参数进行指定

(2)调节Executor堆外内存:会避免掉某些JVM OOM的异常问题,同时,可以提升整体Spark作业的性能。

(3)调节连接等待时长↓:GC时,Spark的Executor进程就会停止工作,无法提供相应,此时,由于没有响应,无法建立网络连接,会导致网络连接超时,避免部分的XX文件拉取失败、XX文件lost等报错

二、Spark数据倾斜

不同的key对应的数据量不同导致的不同task所处理的数据量不同

表现及定位

1、解决方案一:聚合原数据-避免shuffle、增大key的粒度

2、解决方案二:过滤导致倾斜的key

3、解决方案三:提高shuffle操作中的reduce并行度(分散多个key):让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据

4、解决方案四:使用随机key实现双重聚合:加前缀第一次聚合后,去掉前缀在进行局部聚合

5、解决方案五:将reduce join转换为map join,采用广播小RDD全量数据+map算子来实现

6、解决方案六:sample采样对倾斜key单独join到一个单独的RDD,shuffle时会被分散到多个task

7、解决方案七:使用随机数以及扩容进行join,将原先一样的key通过附加随机前缀变成不一样的key,然后就可以将这些处理后的“不同key”分散到多个task中去处理

三、SparkTroubleShooting

1、故障排除一:控制reduce端缓冲大小以避免OOM

2、故障排除二:JVM GC导致的shuffle文件拉取失败,增加重试次数和等待时间

3、故障排除三:解决各种序列化导致的报错:自定义类等必须可以序列化

4、故障排除四:解决算子函数返回NULL导致的问题:返回特殊值、filter后调用coalesce算子进行优化

5、故障排除五:解决YARN-CLIENT模式导致的网卡流量激增问题:YARN-client(测试环境)模式下,Driver启动在本地机器上,而Driver负责所有的任务调度,需要与YARN集群上的多个Executor进行频繁的通信,生产环境下的YARN-cluster模式不会产生

6、故障排除六:解决YARN-CLUSTER模式的JVM栈内存溢出无法执行问题:增加PermGen的容量,参数设置

7、故障排除七:解决SparkSQL导致的JVM栈内存溢出:将一条sql语句拆分为多条sql语句来执行

8、故障排除八:持久化与checkpoint的使用:对这个RDD进行checkpoint持久化到HDFS上

【Spark】Day06-Spark高级课程:性能调优、算子调优、Shuffle调优、JVM调优、数据倾斜、TroubleShooting的更多相关文章

  1. Spark性能调优之解决数据倾斜

    Spark性能调优之解决数据倾斜 数据倾斜七种解决方案 shuffle的过程最容易引起数据倾斜 1.使用Hive ETL预处理数据    • 方案适用场景:如果导致数据倾斜的是Hive表.如果该Hiv ...

  2. 【Spark调优】小表join大表数据倾斜解决方案

    [使用场景] 对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案. [解决方案] ...

  3. Spark面试题(五)——数据倾斜调优

    1.数据倾斜 数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈. 数据倾斜俩大直 ...

  4. Spark调优 数据倾斜

    1. Spark数据倾斜问题 Spark中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题. 例如,reduce ...

  5. spark调优——数据倾斜

    Spark中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题. 例如,reduce点一共要处理100万条数据,第 ...

  6. Spark记录-Spark性能优化(开发、资源、数据、shuffle)

    开发调优篇 原则一:避免创建重复的RDD 通常来说,我们在开发一个Spark作业时,首先是基于某个数据源(比如Hive表或HDFS文件)创建一个初始的RDD:接着对这个RDD执行某个算子操作,然后得到 ...

  7. spark 性能优化 数据倾斜 故障排除

    版本:V2.0 第一章       Spark 性能调优 1.1      常规性能调优 1.1.1   常规性能调优一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围 ...

  8. Spark数据倾斜解决方案及shuffle原理

    数据倾斜调优与shuffle调优 数据倾斜发生时的现象 1)个别task的执行速度明显慢于绝大多数task(常见情况) 2)spark作业突然报OOM异常(少见情况) 数据倾斜发生的原理 在进行shu ...

  9. 最完整的数据倾斜解决方案(spark)

    一.了解数据倾斜 数据倾斜的原理: 在执行shuffle操作的时候,按照key,来进行values的数据的输出,拉取和聚合.同一个key的values,一定是分配到一个Reduce task进行处理. ...

  10. 【JVM进阶之路】十:JVM调优总结

    1.调优原则 JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹. 比较认可廖雪峰老师的观点,要认识到JVM调优不是常规手段,性能问题一般第一选择是优化程序,最后的 ...

随机推荐

  1. Redis的web管理界面redis-manager

    下载 下载地址:https://github.com/ngbdf/redis-manager/releases 配置 tar -zxv -f redis-manager-2.3.2.2-RELEASE ...

  2. nexus清理释放磁盘空间

    应用背景 自建的maven私服(或者叫私仓)nexus在使用过程中,因很多服务不断迭代更新上传jar包至nexus中,底层存放在一个叫Blob Stores的存储中,最近发现该存储已增大至好几百G,有 ...

  3. MySQL数据库安装保姆教程及问题解决

    使用Mysql的zip压缩包解压版,下载之后需进行一定的配置,才能使用它. 下面对Mysql压缩包版的安装方法进行详细的描述,如有疑问或错误,望及时反馈. 首先,mysql的官方下载地址点我进行下载 ...

  4. 24_Java8

    Java8 一. Java8概述 Java8(又称JDK1.8)是Java语言开发的一个主要版本. Oracle公司于2014年3月18日发布Java8 支持Lambda表达式 函数式接口 新的Str ...

  5. 《Thinking In Java》作者:不要使用并发!

    前言 今天纯粹就是带你们来读读书的~ 最近除了工作,特地买回了自己很喜欢的作者新发售的一本书<On Java>,作者是我的老朋友布鲁斯·埃克尔,在Java领域很有名,你可能没听过他的名字, ...

  6. POJ2104 K-th number (整体二分)

    刚学了整体二分,用这种解法来解决这道题. 首先对于每个询问时可以二分解决的,这也是可以使用整体二分的前提.将原来的序列看成是插入操作,和询问操作和在一起根据值域进行二分.用树状数组来检验二分值. 1 ...

  7. DDD-领域驱动(四)-使用IMediator 实现领域事件

    领域事件是指:一个领域中出触发的 集成事件是指:多个微服务之前产生的事件 核心对象 IMediator INotification INotificationHandler 引入:IMediator ...

  8. Docker | 发布镜像到镜像仓库

    本文记录发布镜像到 DockerHub 和 阿里云镜像仓库.工作中使用的是JFrog Artifactory 和 Harbor,没有太大差别. 发布镜像到DockerHub https://hub.d ...

  9. VS Code For Web 深入浅出 -- 进程间通信篇

    在上一篇中,我们一起分析了 VS Code 整体的代码架构,了解了 VS Code 是由前后端分离的方式开发的.且无论前端是基于 electron 还是 web,后端是本地还是云端,其调用方式并无不同 ...

  10. [Mysql] 页结构

    什么是页? 页是InnoDB中管理数据的最小单元 页与页之间是通过一个双向链表连接起来. 页的组成 FileHeader 上一页下一页的指针 FIL_PAGE_PREV FIL_PAGE_NEXT P ...