【Spark】Day06-Spark高级课程:性能调优、算子调优、Shuffle调优、JVM调优、数据倾斜、TroubleShooting
一、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上
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/15605437.html