Spark常用的优化有些?

优化的目标:
优化的目标是促成CPU、内存、IO(磁盘和网络)的平衡,通过调整任务并行度,充分利用CPU的并发能力,任务过多会导致任务阻塞和任务调度开支增大,任务过少导致CPU利用率第,数据分片大,出现内存溢出。尽量避免shuffle,shffle一定会导致磁盘IO和网络IO,IO会大幅降低应用性能,如果无法避免shuffle,则要在shuffle的时机和方式上慎重选择。
出发点是平衡而充分的利用硬件资源,从任务开始时合理的并行度、计算过程中的内存充分利用、Shuffle相关优化三个方向思考优化措施,而具体实施又都落实到配置和代码两个方面。
具体的思路:
-
任务开始时的并发度
根据数据集的大小+partitioner计算分片数量,根据分片数量和分片大小确定要申请的资源。
在计算的过程中,如果filter之后出现了数据的大幅减小,可以通过repatition重分区,避免对CPU和内存的浪费。 -
任务计算过程中的内存充分利用
根据任务的特点调整内存各部分使用比例,预估UserMemory、Execution Memory、Storage Memory大小,根据比例调整各部分内存占用比例。缓存计算代价大且会被重复使用的RDD,避免从头到尾的重复计算。缓存使用kryo序列化,
SparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").registerKryoClasses(xxxx)。使用广播变量让同一个Executor下的Task共享用户数据,降低UserMemory的使用大小。
增大任务本地化等待时间:
spark.locality.wait,该值默认3秒,可适当扩大。
考虑RDD的存储压缩spark.rdd.compress -
Shuffle相关优化
使用广播变量避免shuffle
将shuffle的时机尽量延后,尽量降低shuffle过程中全网传输的数量
用key by替换group by
增大map端数据输出缓存大小,spark.shuffle.file.buffer,默认32k,可设置为64k,该值越大,落盘次数越少,速度越快
增大reduce拉取数据时网络缓存的大小,spark.reducer.maxSizeInFlight,默认为48M,可设为96M,该值越大,每次从网络拉取的数据越多,所需要的拉取次数越小。
附:

本文探讨了Apache Spark的性能优化技巧,包括合理设定任务并发度以平衡资源使用,优化内存管理以减少重复计算和使用广播变量降低内存压力,以及在Shuffle操作上的策略调整,如延迟shuffle、调整缓冲大小等。这些措施旨在提高CPU效率,减少磁盘和网络IO,提升整体应用性能。
751

被折叠的 条评论
为什么被折叠?



