美文网首页
Spark持久化缓存

Spark持久化缓存

作者: TOTower | 来源:发表于2019-10-13 18:58 被阅读0次

问题:
1.RDD中基本所有的数据都是存储都在堆内存里,这部分数据是通过jvm中的GC管理的,进行Spark操作的时候可能会出现资源不一致的问题,当我们长时间不使用某个变量,变量会被gc回收,但是Spark显示的时候显示不出来这一部分数据,所以说Spark无法精确的显示内存信息。
2.发生RDD数据丢失的情况的时候,可以根据lineage重新计算RDD的数据,但是如果依赖关系是宽依赖,重算的消耗比较大,可以使用checkpoint将数据提前写入磁盘,读写磁盘的过程消耗宝贵的IO资源并且写入磁盘之后,依赖关系会消失。

Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或缓存数据集。当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。RDD相关的持久化和缓存,是Spark最重要的特征之一。可以说,缓存是Spark构建迭代式算法和快速交互式查询的关键。如果一个有持久化数据的节点发生故障,Spark 会在需要用到缓存的数据时重算丢失的数据分区。

持久化缓存使用的是堆外内存,直接由操作系统管理,不受GC的控制,并且堆外内存空间要比堆内存空间大3倍。使用起来也比较简单。当数据丢失之后Spark首先会去缓存中查找数据,没有缓存就检查checkpoint,如果也没有就只能重新计算了。

val sumed: RDD[(String, Int)] = tuples.reduceByKey(_+_).cache()

需要注意的是cache是transformation函数,所以需要一个action算子来触发。一般来说缓存shuffle之后的数据,以为shuffle的代价比较大,通常shuffle之后紧接一个cache。

持久化等级:
val NONE = new StorageLevel(false, false, false, false)
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
val MEMORY_ONLY = new StorageLevel(false, true, false, true)
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
val OFF_HEAP = new StorageLevel(false, false, true, false)

参数(按顺序)
useDisk是否使用磁盘
useMemory是否使用内存
useoffHeap 是否使用堆外内存
deserialized是否使用反序列化
replication 副本的数量

如果使用cache函数缓存,默认使用MEMORY_ONLY,如果需要更改持久化等级,可以使用prisist函数设置持久化等级。

缓存的RDD什么时候去释放呢?当我们调用persist缓存一个RDD时,会调用registerRDDForCleanup(this),这就是将本身的RDD注册到一个弱引用中。当这个RDD变为不可达时,会自动将该RDD对象插入到referenceQueue中,等到下次GC时就会走doCleanupRDD分支。为了让出内存,除了手动unpersist之外,MetadataCleaner的SPARK_CONTEXT会定期清理persistentRdds中过期的数据,其实与unpersist产生的作用是一样的。一旦清理了,那这个缓存的RDD就没有强引用了。

相关文章

  • Spark持久化缓存

    问题:1.RDD中基本所有的数据都是存储都在堆内存里,这部分数据是通过jvm中的GC管理的,进行Spark操作的时...

  • webpack 持久化缓存

    前言 什么是持久化缓存,为什么做持久化缓存? webpack 如何做持久化缓存? 持久化缓存 首先我们需要去解释一...

  • RDD 持久化的工作原理

    Spark 中一个很重要的能力是将数据持久化(或称为缓存),在多个操作间都可以访问这些持久化的数据。当持久化一个 ...

  • Spark Streaming(六):缓存与持久化

    1、概述 与RDD类似,Spark Streaming也可以让开发人员手动控制,将数据流中的数据持久化到内存中。对...

  • 分布式-缓存

    缓存 Memcached 不可持久化Redis 可持久化 Memcached Memcached数据访问模型添加新...

  • hiberante3-day2

    一、hibernate持久化对象状态(一级缓存)持久化对象 Persistent Object = POJO +...

  • 大数据入门:Spark持久化存储策略

    持久化存储是Spark非常重要的一个特性,通过持久化存储,提升Spark应用性能,以更好地满足实际需求。而Spar...

  • Spark相关文章索引(3)

    环境部署 Spark2.1.0的Standalone模式部署 基本常识 spark中的rdd的持久化 Spark入...

  • RDD持久化

    RDD持久化 Spark非常重要的一个功能特性就是可以将RDD持久化在内存中。当对RDD执行持久化操作时,每个节点...

  • 数据持久化

    数据持久化及数据更新缓存 常用的8种缓存机制:HTTP缓存, locationStorage, Session S...

网友评论

      本文标题:Spark持久化缓存

      本文链接:https://www.haomeiwen.com/subject/juckmctx.html