RDD緩存策略


Spark支持將數據集放置在集群的緩存中,以便於數據重用。

 

Spark緩存策略對應的類:

class StorageLevel private(
  private var useDisk_ : Boolean,
  private var useMemory_ : Boolean,
  private var useOffHeap_ : Boolean,
  private var deserialized_ : Boolean,
  private var replication_ : Int = 1)
}

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(false, false, true, false)
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

StorageLevel關鍵屬性
useDisk_  是否使用磁盤
useMemory_ 是否使用內存
deserialized_ 是否進行反序列化(即原生方式,不序列化)
replication_ 備份數目

 

 

 

 

 

序列化后的對象存放在內存中,占用的內存少,但是用時需要反序列化,會消耗CPU;

個人推薦:如果內存使用緊張但是CPU夠用時建議考慮使用序列化后緩存;或者是選擇性能更好的序列化工具。

 

 可選用的存儲級別有如下:

存儲級別 描述
MEMORY_ONLY
將RDD 作為反序列化的的對象存儲JVM 中。如果RDD不能被內存裝下,一些分區將不會被緩存,並且在需要的時候被重新計算。
這是是默認的級別
MEMORY_AND_DISK
將RDD 作為反序列化的的對象存儲在JVM 中。如果RDD不能被與內存裝下,超出的分區將被保存在硬盤上,並且在需要時被讀取
MEMORY_ONLY_SER
將RDD 作為序列化的的對象進行存儲(每一分區占用一個字節數組)。
通常來說,這比將對象反序列化的空間利用率更高,尤其當使用fast serializer,但在讀取時會比較占用CPU
MEMORY_AND_DISK_SER
與MEMORY_ONLY_SER 相似,但是把超出內存的分區將存儲在硬盤上而不是在每次需要的時候重新計算
DISK_ONLY 只將RDD 分區存儲在硬盤上
DISK_ONLY_2等帶2的
與上述的存儲級別一樣,但是將每一個分區都復制到兩個集群結點上

 

 

 

 

 

 

 

 

 

 

存儲級別選擇原則:
spark的不同存儲級別,旨在滿足內存使用和CPU效率權衡上的不同需求。建議通過以下步驟來進行選擇:
1)如果RDDs可以很好的與默認的存儲級別MEMORY_ONLY契合,就不需要做任何調整,這已經是CPU使用效率最高的選項,它使得RDDs的操作盡可能的快;
2)如果不行,試着使用MEMORY_ONLY_SER,並且選擇一個快速序列號的庫使得對象在比較高的空間使用率下,依然可以較快的被訪問;
3)盡可能的不要存儲在硬盤中,除非計算數據集的函數計算量特別大,或者它們過濾了大量的數據,否則重新計算一個分區的速度和從與硬盤中讀取基本差不多快;

 

注意:

1)spark默認存儲策略為MEMORY_ONLY:只緩存到內存並且以原生方式存(反序列化)一個副本;

2)MEMORY_AND_DISK存儲級別在內存夠用時直接保存到內存中,只有當內存不足時,才會存儲到磁盤中。

 

 

詳細信息參見官方文檔:http://spark.apache.org/docs/latest/programming-guide.html

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM