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