文章目录
前言
本篇主要讲述了如何在执行pyspark任务时候缓存或者共享变量,以达到节约资源、计算量、时间等目的一、PySpark RDD 持久化
参考文献:https://sparkbyexamples.com/pyspark-rdd#rdd-persistence
我们在上一篇博客提到,RDD 的转化操作是惰性的,要等到后面执行行动操作的时候,才会真正执行计算;
那么如果我们的流程图中有多个分支,比如某一个转换操作 X 的中间结果,被后续的多个并列的流程图(a,b,c)运用,那么就会出现这么一个情况:
在执行后续的(a,b,c)不同流程的时候,遇到行动操作时,会重新从头计算整个图,即该转换操作X,会被重复调度执行:(X->a), (X->b), (X->c); 如此一来就会浪费时间和计算资源,则RDD的持久化就显得十分有用了。
PySpark 通过使用 cache()
和persist()
提供了一种优化机制,来存储 RDD 的中间计算,以便它们可以在后续操作中重用。当持久化或缓存一个 RDD 时,每个工作节点将它的分区数据存储在内存或磁盘中,并在该 RDD 的其他操作中重用它们。Spark 在节点上的持久数据是容错的,这意味着如果任何分区丢失,它将使用创建它的原始转换自动重新计算
① cache()
默认将 RDD 计算保存到存储级别 MEMORY_ONLY
,这意味着它将数据作为未序列化对象存储在 JVM 堆中
(对于Spark DataFrame 或 Dataset 缓存将其保存到存储级别 ` MEMORY_AND_DISK’)
cachedRdd = rdd.cache()
②persist()
有两种函数签名
第一个签名不接受任何参数,默认情况下将其保存到MEMORY_AND_DISK存储级别,
例:
dfPersist = df.persist()
第二个签名StorageLevel作为参数将其存储到不同的存储级别;
例:
dfPersist = df