spark调优

1】spark常规性能调优

(1)提交作业参数合理的设置

(2)rdd尽可能的复用

(3)rdd持久化

 

 

(4)并行度调节

(5)广播变量

(6)kryo序列化

(7)调节本地化等待时长(数据本地化思想)spark.locality.wait   https://blog.csdn.net/zhouyan8603/article/details/84197190

2】spark算子调优

(1)尽量使用mapPartitions(foreachRDD->foreachPartition联合使用插入数据库)

(2)foreachPartition优化数据库操作

(3)filter和coalesce的配合使用

 

 

(4)repartition解决sparksql低并行度的问题

 

 

 

(5)reduceByKey本地聚合

3】spark Shuffle调优  https://www.cnblogs.com/tesla-turing/p/11959572.html

(0)开启了map端输出文件合并机制 

new SparkConf().set("spark.shuffle.consolidateFiles", "true")

(1)调节map端缓冲区大小

在Spark任务运行过程中,如果shuffle的map端处理的数据量比较大,但是map端缓冲的大小是固定的,可能会出现map端缓冲数据频繁spill溢写到磁盘文件中的情况,使得性能非常低下,通过调节map端缓冲的大小,可以避免频繁的磁盘IO操作,进而提升Spark任务的整体性能。

map端缓冲的配置方法

val conf = new SparkConf().set("spark.shuffle.file.buffer", "64")

 (2)调节reduce端拉取数据缓冲区大小(减少拉取次数,从而减少网络传输的次数,提高性能)

(3)调节reduce端拉取数据重试次数(可以避免task 正在gc,或者网络不稳定导致拉取失败,导致任务失败)

(4)调节reduce端拉取数据等待间隔(可以避免task 正在gc,或者网络不稳定导致拉取失败,导致任务失败)

(5)调节SortShuffle排序操作阈值

 

 

在实际生产环境中,我们在什么时候来调节两个参数?

看Spark UI,如果你的公司是决定采用standalone模式,那么狠简单,你的spark跑起来,会显示一个Spark UI的地址,4040的端口,进去看,依次点击进去,可以看到,你的每个stage的详情,有哪些executor,有哪些task,每个task的shuffle write和shuffle read的量,shuffle的磁盘和内存,读写的数据量;如果是用的yarn模式来提交,课程最前面,从yarn的界面进去,点击对应的application,进入Spark UI,查看详情。

如果发现shuffle 磁盘的write和read,很大。这个时候,就意味着最好调节一些shuffle的参数。进行调优。首先当然是考虑开启map端输出文件合并机制。

调节上面说的那两个参数。调节的时候的原则。spark.shuffle.file.buffer,每次扩大一倍,然后看看效果,64,128;spark.shuffle.memoryFraction,每次提高0.1,看看效果。

不能调节的太大,太大了以后过犹不及,因为内存资源是有限的,你这里调节的太大了,其他环节的内存使用就会有问题了。

调节了以后,效果?map task内存缓冲变大了,减少spill到磁盘文件的次数;reduce端聚合内存变大了,减少spill到磁盘的次数,而且减少了后面聚合读取磁盘文件的数量。

 

 

 

4】jvm调优

https://www.cnblogs.com/Transkai/p/11449166.html

降低cache操作的内存占比(默认是60%) spark.storage.memoryFraction,0.6 -> 0.5 -> 0.4 -> 0.2

 

posted @ 2020-04-16 15:05  hulifang  阅读(194)  评论(0编辑  收藏  举报