Spark核心编程-RDD持久化详解

一、不使用RDD持久化

二、使用RDD持久化

三、持久化对于性能调优的原则

  1. 尽量去复用RDD,差不多的RDD,可以抽取称为一个共同的RDD,供后面的RDD计算时,反复使用。
  2. 公共RDD一定要实现持久化,对于要多次计算和使用的公共RDD,一定要进行持久化。 持久化,也就是说,将RDD的数据缓存到内存中/磁盘中,以后无论对这个RDD做多少次计算,都是直接取这个RDD的持久化的数据,比如从内存中或者磁盘中,直接提取一份数据。
  3. 持久化,是可以进行序列化的。如果正常将数据持久化在内存中,那么可能会导致内存的占用过大,这样的话,也许会导致OOM内存溢出。 当纯内存无法支撑公共RDD数据完全存放的时候,就优先考虑,使用序列化的方式在纯内存中存储。将RDD的每个partition的数据,序列化成一个大的字节数组,就一个对象;序列化后,大大减少内存的空间占用。 序列化的方式,唯一的缺点就是:在获取数据的时候,需要反序列化。 如果序列化纯内存方式,还是导致OOM,内存溢出;就只能考虑磁盘的方式,内存+磁盘的普通方式(无序列化或者序列化)。
  4. 为了数据的高可靠性,而且内存充足,可以使用双副本机制,进行持久化。持久化的双副本机制,持久化后的一个副本,因为机器宕机了,副本丢了,就还是得重新计算一次;持久化的每个数据单元,存储一份副本,放在其他节点上面;从而进行容错;一个副本丢了,不用重新计算,还可以使用另外一份副本。 这种方式仅仅针对你的内存资源极度充足。

四、删除持久化数据

Spark核心编程-RDD的实现和编程接口中,我们提到Spark内存是使用LRU回收算法来进行管理。Spark会监控集群中每个节点的内存缓存使用情况,当内存不足时,并采用LRU算法回收内存。如果需要手动删除RDD,可以使用RDD.unpersist()方法来删除缓存数据。

猜你喜欢

转载自blog.csdn.net/Anbang713/article/details/81588158