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