SparkCore-RDD持久化操作
什麼是持久化
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
相關文章
- redis(13)持久化操作-AOFRedis持久化
- Spark效能優化:對RDD持久化或CheckPoint操作Spark優化持久化
- Redis資料持久化—RDB持久化與AOF持久化Redis持久化
- AOF持久化(儲存的是操作redis命令)持久化Redis
- 詳細分析Redis的持久化操作——RDB與AOFRedis持久化
- Redis的兩種持久化方式-快照持久化(RDB)和AOF持久化Redis持久化
- redis系列:RDB持久化與AOF持久化Redis持久化
- Redis 持久化Redis持久化
- Redis - 持久化Redis持久化
- redisaof持久化Redis持久化
- ehcache持久化持久化
- Docker 持久化Docker持久化
- redis持久化Redis持久化
- [Redis]持久化Redis持久化
- SpringCloud使用Sentinel,Sentinel持久化,Sentinel使用nacos持久化SpringGCCloud持久化
- redis ——AOF持久化Redis持久化
- Redis 持久化方案Redis持久化
- redis 之 持久化Redis持久化
- Redis:持久化篇Redis持久化
- Redis 的持久化Redis持久化
- Redis 持久化(Persistence)Redis持久化
- redis-持久化Redis持久化
- 可持久化trie持久化
- Redis 七 持久化Redis持久化
- Redis的持久化Redis持久化
- redis持久化策略Redis持久化
- OpenCV持久化(一)OpenCV持久化
- OpenCV持久化(二)OpenCV持久化
- Redis之持久化Redis持久化
- ActiveMQ持久化方式MQ持久化
- redis 持久化策略Redis持久化
- 應用PMDK修改WAL操作使之適配持久化記憶體持久化記憶體
- RDD持久化,不使用RDD持久化的問題的工作原理持久化
- Redis的持久化方案Redis持久化
- 使用 Java 持久化 APIJava持久化API
- Redis 持久化詳解Redis持久化
- redis快照--RDB持久化Redis持久化
- Redis的持久化方式Redis持久化