簡體   English   中英

從內存中觸發非緩存的RDD逐出

[英]Spark non-cached RDD Eviction from memory

從這篇文章中,RDD可以保留多長時間? ,根據以下內容,我想知道:

就像其他對象一樣,RDD是一個對象。 如果您不持久化/緩存它,它將與托管語言下的任何其他對象一起使用,並且一旦沒有活動的根對象指向它,它就會被收集?

一旦沒有活動的根對象指向它,到底意味着什么

  • 例如,該動作何時完成?
  • 還是如果轉換已成功執行?

我讀了盡可能多的書,但發現心中總有一個未解決的問題。 這位著名專家的回應使我心存疑慮,我無法驅逐。

RDD血統何時創建? 如何找到譜系圖? 例子很棒,在這里重新展示:

val nums = sc.parallelize(0 to 9)
scala> nums.toDebugString
res0: String = (8) ParallelCollectionRDD[0] at parallelize at <console>:24 []

val doubles = nums.map(_ * 2)
scala> doubles.toDebugString
res1: String =
(8) MapPartitionsRDD[1] at map at <console>:25 []
 |  ParallelCollectionRDD[0] at parallelize at <console>:24 []

val groups = doubles.groupBy(_ < 10)
scala> groups.toDebugString
res2: String =
(8) ShuffledRDD[3] at groupBy at <console>:25 []
 +-(8) MapPartitionsRDD[2] at groupBy at <console>:25 []
    |  MapPartitionsRDD[1] at map at <console>:25 []
    |  ParallelCollectionRDD[0] at parallelize at <console>:24 []

假設每個轉換都需要很長時間才能實際執行,那么... RDD [0]什么時候可以被逐出? 即最早的時間點。 關鍵是... RDD [0]是... RDD [1..N]的父對象還是所有此類對象的父對象? 我在其他地方找到這樣的聲明時說。

我不認為它是重復的,它正在尋求澄清所陳述的內容。

我的解釋是,術語“根對象”意味着RDD [0]不能進行垃圾回收,直到發生某個動作或在動作DAG路徑中發生了緩存或檢查點。 尋求驗證。 對於我來說關於根對象是什么的句子現在還不清楚。 我以為根對象是鏈中較早的RDD。

RDD具有不同類型的內存足跡:

1)它消耗驅動程序上的內存(作為常規對象)

2)有關該RDD的信息已分配給工人

3)如果RDD被緩存,則可能會在worker上分配額外的空間

當RDD在(1)方面變得不可訪問時,將通過ContextCleaner觸發對(2)和(3)的清除。 因此,我們僅談論(1)。

是否緩存RDD根本不重要。 執行諸如count / collect類的動作也無關緊要。 當您離開該RDD可見的范圍時,RDD只是作為常規的Java對象而消失。

在您的特定示例中, RDD1取決於RDD0因此除非前者被驅逐,否則后者將不會被驅逐。 RDD1后,才被驅逐RDD2這只會之后被驅逐RDD3 要為垃圾收集器解鎖RDD3 ,您必須(含糊地說)將方法保留在使用位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM