Spark程序性能优化之persist()

Spark的RDD Persistence,是一个重要的能力,可以将中间结果保存,提供复用能力,加速基于中间结果的后续计算,经常可以提高10x以上的性能。在PySpark的DataFrame中同样适用。

主要方法是persist()cache()。官方说明请看RDD Persistence

需要注意的是,Spark Python API中,默认存储级别是MEMORY_AND_DISK

本文记录一下实际开发中使用Spark这个能力的一些心得,主要是PySpark。

persist()cache()该使用哪个?

建议总是使用persist()

原因:persist()功能更加强大,由于其支持设置存储级别,所以用起来更加灵活方便。cache()虽然是使用默认存储级别,但是在网上看到,使用cache()出现内存溢出的问题,换成persist()就没问题。我一般使用persist(),所以没遇到过这个问题。

什么时候使用persist()?

1、当一个中间数据集,后面被多个计算重复使用,你应该对这个数据集使用persist()

2、如果资源允许,你应该尽可能多的使用persist(),因为这可以极大的减少重复计算,提高程序性能。

关于第2点,至少我写这篇随笔时,是这样认为的。为什么这么说,是因为我在实际开发中做过一个对比测试。

我开发了一个PySpark程序,只对最大的几个需要重复使用的数据集使用了persist(),程序运行时间10分钟左右。这个程序中,有不少中间结果会被重复使用,当我对一部分中间结果数据集也使用了persist()之后,程序运行时间降低为8.7分钟左右。当我对大部分会被重复使用的中间结果数据集使用了persist()之后,程序运行时间进一步降低为8分钟左右。

我对比了三种程序的stage情况,发现使用persist()多的程序,stage数量有一定的减少,另外相同的stage,可以达到几秒的差距,当然也许和机器配置有关。不过这个性能提升确实非常明显!!也许存在偶然性,不过理论上来说,这个应该可以提升性能。

什么时候使用unpersist()

unpersist()是用来释放资源的,是persist()的反向操作。

你应该在第一时间使用unpersist(),也就是说,当这个数据集不再被使用,应该立刻释放其占用的资源。

该如何选择存储级别?

如果条件允许,建议使用默认存储级别。

在PySpark中,persist()的默认存储级别是MEMORY_AND_DISK,个人觉得这个存储级别是一个非常好的策略。

至于其他存储级别,可以在程序调试中对比测试其性能,来决定使用哪个存储级别。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您介绍Spark性能优化指南——高级篇。 1. 数据倾斜问题 数据倾斜是指在Spark任务中,某些分区的数据量远远大于其他分区,导致任务执行时间过长。解决数据倾斜问题的方法包括: - 使用随机前缀或哈希分桶等方式对数据进行分区,使数据分布更加均匀。 - 对于reduceByKey等聚合操作,使用combineByKey或aggregateByKey等方法,避免数据倾斜。 - 对于join操作,使用broadcast变量或者将小表缓存到内存中,避免数据倾斜。 2. 内存管理 Spark的内存管理对于任务的性能有着重要的影响。以下是一些内存管理的优化方法: - 调整executor内存分配比例,避免OOM错误。 - 合理设置内存管理参数,如spark.memory.fraction、spark.memory.storageFraction等。 - 使用持久化存储,如cache或persist方法,避免重复计算和数据丢失。 3. 磁盘IO 磁盘IO是Spark任务中的瓶颈之一。以下是一些优化磁盘IO的方法: - 使用本地磁盘而非网络磁盘,避免网络IO带来的延迟。 - 使用压缩算法,如Snappy或LZ4,减少磁盘IO的数据量。 - 对于shuffle操作,使用Tungsten排序等优化算法,减少磁盘IO的次数。 4. 并行度 并行度是指任务中可以同时执行的任务数。以下是一些优化并行度的方法: - 调整任务的并行度,使任务能够充分利用集群资源。 - 对于shuffle操作,调整reduce任务的数量,避免过多的reduce任务导致性能下降。 - 对于数据量较大的任务,使用分区并行执行,避免单个任务的执行时间过长。 5. 网络传输 网络传输是Spark任务中的另一个瓶颈。以下是一些优化网络传输的方法: - 调整网络传输的缓存大小,使数据传输更加高效。 - 使用序列化算法,如Kryo或Java序列化,减少网络传输的数据量。 - 对于shuffle操作,使用Tungsten排序等优化算法,减少网络传输的数据量。 希望以上内容能够帮助您更好地优化Spark任务的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值