第十周 第5章 RDD持久化
RDD持久化原理
1 | Spark中有一个非常重要的功能就是可以对RDD进行持久化。当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition数据持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存中缓存的partition数据。 |
1 | val dataRDD = sc.parallelize(Array(1,2,3,4,5)) |
1 | 巧妙使用RDD持久化,在某些场景下,对spark应用程序的性能有很大提升。特别是对于迭代式算法和快速交互式应用来说,RDD持久化,是非常重要的。要持久化一个RDD,只需要调用它的cache()或者persist()方法就可以了。在该RDD第一次被计算出来时,就会直接缓存在每个节点中。而且Spark的持久化机制还是自动容错的,如果持久化的RDD的任何partition数据丢失了,那么Spark会自动通过其源RDD,使用transformation算子重新计算该partition的数据。 |
RDD持久化策略
1 | 下面看一下目前Spark支持的一些持久化策略 |
1 | 补充说明: |
如何选择RDD持久化策略
1 | Spark提供了多种持久化级别,主要是为了在CPU和内存消耗之间进行取舍。 |
案例:使用RDD的持久化
1 | 下面来写一个案例验证一下RDD持久化的效果 |
1 | 在没有添加cache之前,每一次都耗时很长 |
1 | java代码如下: |
共享变量
共享变量的工作原理
1 | Spark还有一个非常重要的特性就是共享变量 |
Broadcast Variable
1 | Broadcast Variable会将使用到的变量,仅仅为每个节点拷贝一份,而不会为每个task都拷贝一份副本,因此其最大的作用,就是减少变量到各个节点的网络传输消耗,以及在各个节点上的内存消耗 |

1 | 先看左边的代码 |
scala
1 | package com.imooc.scala |
java
1 | package com.imooc.java; |
Accumulator
1 | Spark提供的Accumulator,主要用于多个节点对一个变量进行共享性的操作。 |
scala
1 | package com.imooc.scala |
java
1 | package com.imooc.java; |