RDD的快取

lmandcc發表於2021-11-11

RDD的快取/持久化

快取解決的問題

快取解決什麼問題?-解決的是熱點資料頻繁訪問的效率問題

在Spark開發中某些RDD的計算或轉換可能會比較耗費時間,
如果這些RDD後續還會頻繁的被使用到,那麼可以將這些RDD進行持久化/快取,
這樣下次再使用到的時候就不用再重新計算了,提高了程式執行的效率。

import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}

object Demo16Cache {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setAppName("****").setMaster("local")
    val sc: SparkContext = new SparkContext(conf)
    val linesRDD: RDD[String] = sc.textFile("spark/data/words.txt")
    //加入快取的三種方式
    //方式一
    linesRDD.cache()//將常用的RDD放入快取中,增加效率
    //StorageLevel.MEMORY_ONLY 預設只放在快取中


    //方式二
    //linesRDD.persist()
    //def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)

    //指定快取儲存方式
    linesRDD.persist(StorageLevel.MEMORY_AND_DISK)
    /**
     * 快取的儲存方式:推薦使用MEMORY_AND_DISK
     * object StorageLevel {
     * 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(true, true, true, false, 1)
     */


    linesRDD.flatMap(word => word)
      .groupBy(word => word)
      .map(l => {
        val word = l._1
        val cnt = l._2.size
        word + "," + cnt
      }).foreach(println)

    val wordRDD: Unit = linesRDD.map(word => word)
        .foreach(println)

    //釋放快取
    linesRDD.unpersist()
  }
}

RDD中的checkpoint

RDD資料可以持久化到記憶體中,雖然是快速的,但是不可靠
也可以把資料放在磁碟上,也並不是完全可靠的,
我們可以把快取資料放到我的HDFS中,藉助HDFS的高可靠,高可用以及高容錯來保證資料安全

sc.setCheckpointDir(HDFS路徑)//設定checkpoint路徑,開發中一般設定為HDFS的目錄
RDD.checkpoint//對計算複雜且後續會被頻繁使用的RDD進行checkpoint

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel

object Demo17CheckPoint {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setAppName("spark").setMaster("local")
    val sc: SparkContext = new SparkContext(conf)
    val linesRDD: RDD[String] = sc.textFile("spark/data/words.txt")

    /**
     * RDD資料可以持久化到記憶體中,雖然是快速的,但是不可靠
     * 也可以把資料放在磁碟上,也並不是完全可靠的
     * 我們可以把快取資料放到我的HDFS中,藉助HDFS的高可靠,高可用以及高容錯來保證資料安全
     *
     */
    //設定HDFS的目錄
    sc.setCheckpointDir("spark/data/checkPoint")
    //對需要快取的RDD進行checkPoint
    linesRDD.checkpoint()
    linesRDD.flatMap(word => word)
      .groupBy(word => word)
      .map(l => {
        val word = l._1
        val cnt = l._2.size
        word + "," + cnt
      }).foreach(println)

    val wordRDD: Unit = linesRDD.map(word => word)
      .foreach(println)
  }

}

RDD中的快取/持久化與checkpoint的區別

1.儲存位置

快取/持久化資料存預設存在記憶體, 一般設定為記憶體+磁碟(普通磁碟)

Checkpoint檢查點:一般儲存在HDFS

2.功能

快取/持久化:保證資料後續使用的效率高

Checkpoint檢查點:保證資料安全/也能一定程度上提高效率

3.對於依賴關係:

快取/持久化:保留了RDD間的依賴關係

Checkpoint檢查點:不保留RDD間的依賴關係

4.開發中如何使用?

對於計算複雜且後續會被頻繁使用的RDD先進行快取/持久化,再進行Checkpoint

相關文章