2015-04-22 80 views
3

阿帕奇星火DAGScheduler缺少父母當運行我在Apache星火迭代程序中,我偶爾會得到消息:爲舞臺

INFO scheduler.DAGScheduler: Missing parents for Stage 4443: List(Stage 4441, Stage 4442) 

我收集這意味着它需要計算父RDD - 但我不是100%確定。我不只是得到其中的一個,我最終得到的是100個,如果不是數千個,它會使我的程序完全放慢速度,而另一個迭代不會在10-15分鐘內完成(它們通常需要4-10秒) 。

cacheRDD在每次迭代,使用StorageLevel.MEMORY_AND_DISK_SER。下一次迭代使用這個RDD。因此,RDD的譜系變得非常大,因此需要緩存。但是,如果我緩存(並泄漏到磁盤),父母如何丟失?

回答

5

我引用伊姆蘭·拉希德從Cloudera公司:

這是正常的,如果他們是洗牌階段的地圖,其中獲得多次讀取階段得到跳過。例如,下面是我之前編寫的一個示例程序,用於演示:「d3」不需要重新洗牌,因爲每次讀取w /相同的分區程序。因此,在這種方式跳過階段是一件好事:

val partitioner = new org.apache.spark.HashPartitioner(10) 
val d3 = sc.parallelize(1 to 100).map { x => (x % 10) -> x}.partitionBy(partitioner) 
(0 until 5).foreach { idx => 
val otherData = sc.parallelize(1 to (idx * 100)).map{ x => (x % 10) -> x}.partitionBy(partitioner) 
println(idx + " ---> " + otherData.join(d3).count()) 
} 

如果您運行此,F您在UI看,你會看到,除了第一個所有作業都被跳過一個階段。你還可以看到這在日誌中:

15/06/08十點52分37秒INFO DAGScheduler:最後階段的家長:名單(第12階段,第一階段13)

15/06/08 10: 52:37 INFO DAGScheduler:失蹤的父母:列表(第13階段)

不可否認,這並不十分清楚,但這就是說,DAGScheduler首先創建了階段12作爲必要步驟,然後再進行了更改因爲意識到第12階段所需的一切已經存在,所以沒有任何事情要做。

查看電子郵件源如下: http://apache-spark-developers-list.1001551.n3.nabble.com/

+0

好的,謝謝!但爲什麼它會減慢程序呢? – monster

+0

我自己有長譜系迭代程序的經驗是每10-15次迭代就需要檢查點。檢查點將使該迭代長達1.5--2倍(您正在將文件寫入SPARK_CHECKPOINT_DIR中的永久性存儲),但會加快接下來的幾次迭代。 我在迭代程序中遇到的另一個問題是最初錯過了一個RDD來緩存,這樣這個RDD的重用會在後面的RDD的譜系圖中觸發一個遞歸,導致後面的迭代永遠不會結束。如果你在這種血統的某個地方甚至有1個RDD,它可能會發生。 – modulus0