火花檢查點和堅持到磁盤有什麼區別?這兩個存儲在本地磁盤?火花檢查點和堅持到磁盤有什麼區別
回答
幾乎沒有什麼重要的區別,但最基本的是沿襲血統。 Persist
/cache
保持血統不變,而checkpoint
打破血統。讓我們考慮下面的例子:
import org.apache.spark.storage.StorageLevel
val rdd = sc.parallelize(1 to 10).map(x => (x % 3, 1)).reduceByKey(_ + _)
cache
/persist
:val indCache = rdd.mapValues(_ > 4) indCache.persist(StorageLevel.DISK_ONLY) indCache.toDebugString // (8) MapPartitionsRDD[13] at mapValues at <console>:24 [Disk Serialized 1x Replicated] // | ShuffledRDD[3] at reduceByKey at <console>:21 [Disk Serialized 1x Replicated] // +-(8) MapPartitionsRDD[2] at map at <console>:21 [Disk Serialized 1x Replicated] // | ParallelCollectionRDD[1] at parallelize at <console>:21 [Disk Serialized 1x Replicated] indCache.count // 3 indCache.toDebugString // (8) MapPartitionsRDD[13] at mapValues at <console>:24 [Disk Serialized 1x Replicated] // | CachedPartitions: 8; MemorySize: 0.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 587.0 B // | ShuffledRDD[3] at reduceByKey at <console>:21 [Disk Serialized 1x Replicated] // +-(8) MapPartitionsRDD[2] at map at <console>:21 [Disk Serialized 1x Replicated] // | ParallelCollectionRDD[1] at parallelize at <console>:21 [Disk Serialized 1x Replicated]
checkpoint
:val indChk = rdd.mapValues(_ > 4) indChk.checkpoint // indChk.toDebugString // (8) MapPartitionsRDD[11] at mapValues at <console>:24 [] // | ShuffledRDD[3] at reduceByKey at <console>:21 [] // +-(8) MapPartitionsRDD[2] at map at <console>:21 [] // | ParallelCollectionRDD[1] at parallelize at <console>:21 [] indChk.count // 3 indChk.toDebugString // (8) MapPartitionsRDD[11] at mapValues at <console>:24 [] // | ReliableCheckpointRDD[12] at count at <console>:27 []
正如你在第一種情況下拭目以待即使數據是從緩存中提取的,也會保留ineage。這意味着如果indCache
的某些分區丟失,可以重新從頭開始重新計算數據。在第二種情況下,血統在檢查點後完全丟失,並且indChk
沒有攜帶重建所需的信息。
checkpoint
,不像cache
/persist
與其他工作分開計算。這就是爲什麼RDD標記檢查點應緩存:
強烈建議此RDD在內存中保存,否則將其保存在文件將需要重新計算。
最後checkpointed
數據是持久性的,在SparkContext
被銷燬後不會被刪除。
關於數據存儲SparkContext.setCheckpointDir
使用RDD.checkpoint
要求DFS
路徑如果運行在非本地模式。否則它也可以是本地文件系統。 localCheckpoint
和persist
沒有複製應該使用本地文件系統。
注意:
RDD檢查點是不同的概念相比,在星火流一chekpointing。前者旨在解決血統問題,後者則關注流媒體可靠性和故障恢復。
如果您檢查the relevant part of the documentation,它會將數據寫入可靠的系統, HDFS。但是,您應該告訴Apache Spark在哪裏編寫其檢查點信息。
另一方面,堅持是關於緩存數據主要在內存中,如this part of the documentation明確指出。
所以,這取決於你給Apache Spark的目錄。
流媒體的持久性是一個非常不同的問題,與緩存無關。 – zero323
我認爲你可以找到一個非常詳細的解答here
雖然很難概括所有在該網頁上,我會說
堅持
- 遷延性或緩衝帶StorageLevel.DISK_ONLY導致計算RDD的生成並將其存儲在某個位置,以便後續使用該RDD時不會超出重新計算該係數的那一點。
- 在調用persist之後,Spark仍然會記住RDD的血統,即使它沒有調用它。
- 其次,應用程序終止後,將清除緩存或文件銷燬
檢查點
- 檢查點存儲RDD物理到HDFS並摧毀創建它的血統。
- 即使在Spark應用程序終止後,檢查點文件也不會被刪除。
- 檢查點文件可用於後續作業運行或驅動程序
- 檢查點RDD會導致雙重計算,因爲在執行計算和寫入檢查點目錄的實際作業之前,操作將首先調用高速緩存。
您可能想要閱讀文章以瞭解更多Spark的檢查點或緩存操作的詳細信息或內部結構。
留存(MEMORY_AND_DISK)將存儲該數據幀到磁盤和存儲器臨時而不破壞程序即df.rdd.toDebugString()的譜系將返回相同的輸出。它建議使用持續(*)上的計算,也就是將要被重新使用,以避免中間結果重新計算:
df = df.persist(StorageLevel.MEMORY_AND_DISK) calculation1(df) calculation2(df)
。注意,緩存所述數據幀並不能保證,即它將保持在存儲器直到你下次給它打電話。根據內存的使用情況,緩存可以被丟棄。
檢查點(),另一方面,打破沿襲和強制數據框存儲在磁盤上。與cache()/ persist()的使用不同,頻繁的check-pointing會減慢你的程序。建議在以下情況下使用檢查點:a)在不穩定的環境中工作以允許從故障中快速恢復; b)當RDD的新條目依賴於先前的條目時存儲中間計算狀態,即避免重新計算長依賴鏈
- 1. 還原持久性:堅持和補水有什麼區別?
- 2. 谷歌計算引擎:磁盤快照和磁盤映像有什麼區別?
- 3. 應堅持HTML文檔到磁盤
- 4. MVC(火花視圖引擎)x和m有什麼區別?
- 5. 舞臺視頻和火花視頻顯示有什麼區別?
- 6. 本地磁盤和新卷之間有什麼區別?
- 7. 檢查和外鍵有什麼區別?
- 8. 不同預構建火花版本有什麼區別
- 9. 獲取磁盤的大小堅持
- 10. 如何堅持MEF導入和導出信息到磁盤
- 11. elb健康檢查和ec2健康檢查有什麼區別?
- 12. 託管磁盤和非託管磁盤之間的區別
- 13. 火花緩存區別2.0.2和2.1.1
- 14. 安裝文件系統和安裝磁盤驅動器有什麼區別
- 15. 檢查磁盤Powershell
- 16. 硒 - 點擊和ClickAndWait有什麼區別?
- 17. NServiceBus.Distributor和主節點有什麼區別
- 18. 泄漏到磁盤並洗牌寫火花
- 19. 火花清理洗牌溢出到磁盤
- 20. 檢查中同步檢查和異步檢查有什麼區別?
- 21. [ValidateModel]和ASP.NET中有效狀態檢查有什麼區別?
- 22. 將Excel VSTO XSD保存到磁盤並堅持使用C#
- 23. vb.net存儲/堅持時間序列到磁盤
- 24. 點對點和端到端安全性有什麼區別?
- 25. 爲什麼火花
- 26. 有什麼區別`和$(Bash中有什麼區別?
- 27. EhCache磁盤持久化 - 堅持一個任意對象
- 28. 使用EndOfStream和檢查null有什麼區別?
- 29. 運行流量和流量檢查有什麼區別?
- 30. 免費版本和檢查版本有什麼區別?
這是一個非常普遍的問題。最好是在它周圍添加一些背景。要回答你的問題,它可以存儲到任何持久的存儲區 - 本地DIsk或HDFS或NFS安裝的空間等。 – Sumit
@Sumit - 這是一個非常具體的問題,關於兩種Spark RDD方法之間的差異。答案可以是客觀的和專注的,因爲zero323的答案如下所示。 –