Spark ~ RDD 持久化

Spark ~ RDD 持久化

RDD 中是不存储数据的,如果一个 RDD 需要重复使用,那么需要从头再次执行来获取数据。
如果一个 RDD 数据集很重要或者需要重复使用,那就需要持久化
RDD 对象是可以重用的,但是数据无法重用。

参考以下的案列,reduceRdd 和 groupRdd 都依赖于 mapRdd ,在 flatMap 中打印,发现两次调用 mapRdd 都从头再次执行了。

package org.example
import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}

object Kryo {
  def main(args: Array[String]): Unit = {
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)

    var conf = new SparkConf().setMaster("local[*]").setAppName("cai")
    var sc = new SparkContext(conf)

    var rdd = sc.parallelize(List("cai","love","luo","cai"))
    var flatMapRdd = rdd.flatMap(x=>{
      println("从头计算了一遍!!!")
      x.split(",")
    })
    var mapRdd = flatMapRdd.map(x=>(x,1))

    var reduceRdd = mapRdd.reduceByKey(_+_) //依赖 mapRdd ,进行 reduce 操作
    reduceRdd.foreach(println)
    println("---------------------------------------------")
    var groupRdd = mapRdd.groupByKey() //依赖 mapRdd , 进行 groupby 操作
    groupRdd.foreach(println)
  }
}

结果如下:

从头计算了一遍!!!
从头计算了一遍!!!
从头计算了一遍!!!
从头计算了一遍!!!
(love,1)
(luo,1)
(cai,2)
---------------------------------------------
从头计算了一遍!!!
从头计算了一遍!!!
从头计算了一遍!!!
从头计算了一遍!!!
(love,CompactBuffer(1))
(cai,CompactBuffer(1, 1))
(luo,CompactBuffer(1))

因此,可以将 mapRdd 中的数据进行缓存。

RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存, 默认情况下会把数据以缓存在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存,而是触发后面的 action 算子时,该 RDD 将会被缓存在计算节点的内存中,并供后面重用。

cache()

在代码中加入
mapRdd.cache()
,结果如下,可见 mapRdd 之前的 Rdd 只进行了一次,mapRdd 的结果集被缓存到了内存中

从头计算了一遍!!!
从头计算了一遍!!!
从头计算了一遍!!!
从头计算了一遍!!!
(luo,1)
(love,1)
(cai,2)
---------------------------------------------
(love,CompactBuffer(1))
(luo,CompactBuffer(1))
(cai,CompactBuffer(1, 1))

persist()

可以更改存储级别
mapRdd.persist(StorageLevel.MEMORY_AND_DISK_2)

_2 的意思是每个分区在集群中两个节点上建立副本。下图中的 _2 意思都是备份
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值