2016-02-01 27 views
25

火花檢查點和堅持到磁盤有什麼區別?這兩個存儲在本地磁盤?火花檢查點和堅持到磁盤有什麼區別

+0

這是一個非常普遍的問題。最好是在它周圍添加一些背景。要回答你的問題,它可以存儲到任何持久的存儲區 - 本地DIsk或HDFS或NFS安裝的空間等。 – Sumit

+3

@Sumit - 這是一個非常具體的問題,關於兩種Spark RDD方法之間的差異。答案可以是客觀的和專注的,因爲zero323的答案如下所示。 –

回答

29

幾乎沒有什麼重要的區別,但最基本的是沿襲血統。 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路徑如果運行在非本地模式。否則它也可以是本地文件系統。 localCheckpointpersist沒有複製應該使用本地文件系統。

注意

RDD檢查點是不同的概念相比,在星火流一chekpointing。前者旨在解決血統問題,後者則關注流媒體可靠性和故障恢復。

1

如果您檢查the relevant part of the documentation,它會將數據寫入可靠的系統, HDFS。但是,您應該告訴Apache Spark在哪裏編寫其檢查點信息。

另一方面,堅持是關於緩存數據主要在內存中,如this part of the documentation明確指出。

所以,這取決於你給Apache Spark的目錄。

+1

流媒體的持久性是一個非常不同的問題,與緩存無關。 – zero323

12

我認爲你可以找到一個非常詳細的解答here

雖然很難概括所有在該網頁上,我會說

堅持

  • 遷延性或緩衝帶StorageLevel.DISK_ONLY導致計算RDD的生成並將其存儲在某個位置,以便後續使用該RDD時不會超出重新計算該係數的那一點。
  • 在調用persist之後,Spark仍然會記住RDD的血統,即使它沒有調用它。
  • 其次,應用程序終止後,將清除緩存或文件銷燬

檢查點

  • 檢查點存儲RDD物理到HDFS並摧毀創建它的血統。
  • 即使在Spark應用程序終止後,檢查點文件也不會被刪除。
  • 檢查點文件可用於後續作業運行或驅動程序
  • 檢查點RDD會導致雙重計算,因爲在執行計算和寫入檢查點目錄的實際作業之前,操作將首先調用高速緩存。

您可能想要閱讀文章以瞭解更多Spark的檢查點或緩存操作的詳細信息或內部結構。

1
  1. 留存(MEMORY_AND_DISK)將存儲該數據幀到磁盤和存儲器臨時而不破壞程序即df.rdd.toDebugString()的譜系將返回相同的輸出。它建議使用持續(*)上的計算,也就是將要被重新使用,以避免中間結果重新計算:

    df = df.persist(StorageLevel.MEMORY_AND_DISK) 
    calculation1(df) 
    calculation2(df) 
    

    。注意,緩存所述數據幀並不能保證,即它將保持在存儲器直到你下次給它打電話。根據內存的使用情況,緩存可以被丟棄。

  2. 檢查點(),另一方面,打破沿襲和強制數據框存儲在磁盤上。與cache()/ persist()的使用不同,頻繁的check-pointing會減慢你的程序。建議在以下情況下使用檢查點:a)在不穩定的環境中工作以允許從故障中快速恢復; b)當RDD的新條目依賴於先前的條目時存儲中間計算狀態,即避免重新計算長依賴鏈

相關問題