SparkCore-RDD持久化操作

每天都在努力的人發表於2020-12-20

什麼是持久化

One of the most important capabilities in Spark is persisting (or caching) a dataset in memory across operations. When you persist an RDD, each node stores any partitions of it that it computes in memory and reuses them in other actions on that dataset (or datasets derived from it). This allows future actions to be much faster (often by more than 10x). Caching is a key tool for iterative algorithms and fast interactive use.
Spark最重要的功能之一是跨操作在記憶體中持久化(或快取)資料集。當您持久化RDD時,每個節點都將它計算的所有分割槽儲存在記憶體中,並在該資料集(或從該資料集派生的資料集)上的其他操作中重用這些分割槽。這使得未來的行動更快(通常是10倍以上)。快取是迭代演算法和快速互動使用的關鍵工具。

如何進行持久化

You can mark an RDD to be persisted using the persist() or cache() methods on it. The first time it is computed in an action, it will be kept in memory on the nodes. Spark’s cache is fault-tolerant – if any partition of an RDD is lost, it will automatically be recomputed using the transformations that originally created it.
可以使用persist()或cache()方法將RDD標記為持久化。第一次在操作中計算它時,它將儲存在節點上的記憶體中。Spark的快取是容錯的——如果RDD的任何分割槽丟失,它將自動使用最初建立它的轉換重新計算。

持久化策略

In addition, each persisted RDD can be stored using a different storage level, allowing you, for example, to persist the dataset on disk, persist it in memory but as serialized Java objects (to save space), replicate it across nodes. These levels are set by passing a StorageLevel object (Scala, Java, Python) to persist(). The cache() method is a shorthand for using the default storage level, which is StorageLevel.MEMORY_ONLY (store deserialized objects in memory).
此外,每個持久化的RDD都可以使用不同的儲存級別進行儲存,例如,允許您在磁碟上持久化資料集,將其持久化到記憶體中,但作為序列化的Java物件(以節省空間),跨節點複製它。這些級別是通過向persist()傳遞一個StorageLevel物件(Scala、Java、Python)來設定的。cache()方法是使用預設儲存級別的簡寫,它是僅限StorageLevel.MEMORY_ONLY (將反序列化的物件儲存在記憶體中)。

可以通過persist(StoreageLevle的物件)來指定持久化策略,eg:StorageLevel.MEMORY_ONLY。
在這裡插入圖片描述

如何選擇一款合適的持久化策略

第一就選擇預設MEMORY_ONLY,因為效能最高嘛,但是對空間要求最高;如果空間滿足不了,退而求其次,選擇MEMORY_ONLY_SER,此時效能還是蠻高的,相比較於MEMORY_ONLY的主要效能開銷就是序列化和反序列化;如果記憶體滿足不了,直接跨越MEMORY_AND_DISK,選擇MEMEORY_AND_DISK_SER,因為到這一步,說明資料蠻大的,要想提高效能,關鍵就是基於記憶體的計算,所以應該儘可能的在記憶體中儲存物件;DISK_ONLY不用,xx_2的使用如果說要求資料具備高可用,同時容錯的時間花費比從新計算花費時間少,此時便可以使用,否則一般不用。

持久化和非持久化效能比較

object Demo4 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setAppName("Demo2")
      .setMaster("local[*]")
    val sc = new SparkContext(conf)
    //讀取外部資料
    var start = System.currentTimeMillis()
    val lines = sc.textFile("C:\\Users\\70201\\Desktop\\wordcount.txt")
    var count = lines.count()
    println("沒有持久化:#######lines' count: " + count + ", cost time: " + (System.currentTimeMillis() - start) + "ms")
    lines.persist(StorageLevel.DISK_ONLY) //lines.cache()
    start = System.currentTimeMillis()
    count = lines.count()
    println("持久化之後:#######lines' count: " + count + ", cost time: " + (System.currentTimeMillis() - start) + "ms")
    lines.unpersist()//解除安裝持久化資料
    sc.stop()
  }
}

沒有持久化:#######lines’ count: 13, cost time: 1913ms
持久化之後:#######lines’ count: 13, cost time: 373ms

相關文章