Spark性能优化总结

本文总结了Spark性能优化的七个关键点:选择DataFrame/Dataset/SQL进行操作,避免UDF;利用分桶操作预分区数据;合理设定分区数以平衡负载;调整并行度以充分利用资源;将过滤操作前置并使用coalesce减少网络开销;适时缓存重复使用的数据;以及使用广播变量减少数据传输。这些策略能有效提升Spark作业的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据结构的选择

DataFrame、Dataset和SQL在速度上都是相同的,spark会自动使用优化引擎对它们进行优化,相比于RDD的手动编写优化代码要好,同时避免使用UDF函数也是一个优化策略,UDF是昂贵的,因为它们强制将数据表示为JVM中的对象,有时在查询中要对一个记录执行多次此操作。应该尽可能地使用结构化的API来执行操作,因为他们将以更高效地方式执行转化操作。

二、分桶操作

分桶允许Spark根据可能执行的连接操作或聚合操作对数据进行“预先分区”,帮助数据在分区间持续分布,而不是倾斜到一两个分区。分桶允许Spark根据可能执行的连接操作或聚合操作对数据进行“预先分区”,帮助数据在分区间持续分布,而不是倾斜到一两个分区。

三、分区数

对于所有Spark作业来说,分区数量都很重要。如果你的分区太少,那么只有少量节点在工作,这可能会造成数据倾斜。但是如果你有太多的分区,那么启动每一个任务的需要的开销可能会占据所有的资源。为了更好地平衡,你的Shuffle中为每个输出分区设置至少几十兆字节的数据。spark.sql.shuffle.partitions用来配置shuffle操作时的分区数量如join或者aggregate,一般减少分区数用coalesce方法,增加分区数用reparation,但reparation是shuffle操作,也有一定的计算开销,不过reparation的数据一般不存在数据倾斜的问题,同时增加了分区数,并行度更高。

四、并行度

通常建议分配集群中每个CPU核心至少有两到三个任务。你可以通过spark.default.parallelism属性来设置它,并同时根据集群中的核心数量来调整spark.sql.shuffle.partitions属性,通常建议的并行度是总核数的2-3倍,总核数为contains * coresPerContainerspark.default.parallelism用来配置Rdd操作(join, reduceByKey, and parallelize)时的分区数,如果你正在操作DataFrame进行shuffle操作,那么只能通过df = df.repartition(numOfPartitions)来调整分区,但repartition会重新清洗数据,也会有一定的网络开销。

五、过滤优化

将过滤器尽可能地移动到Spark任务的最开始,一般可以根据过滤掉的数据量,来使用coalesce方法减少分区数量,该方法不会执行数据Shuffle,而是将同一节点上的多个分区合并到一个分区中,减少分区数量可以较少任务间的网络开销。

六、缓存

如果多次重复使用某一DataFrame,数据表或RDD,应将其缓存,但如果只用一次,缓存只会降低速度。

七、广播变量

如果某一大块数据被程序中的多个UDF访问,则可以将其广播让每个节点上存储一个只读副本,并避免在每项作业
中重新发送此数据。查找表和机器学习模型作为广播变量可能很有用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值