在Apache Spark上运行我的迭代程序时偶尔会收到消息:
INFO scheduler.DAGScheduler: Missing parents for Stage 4443: List(Stage 4441, Stage 4442)
我收集它意味着它需要计算父RDD
- 但我不是100%肯定。我不会得到其中的一个,如果不是数千个,我最终得到100个 - 它完全减慢了我的程序,另一个迭代没有完成10-15分钟(他们通常需要4-10秒)。
我cache
使用RDD
进行每次迭代的主StorageLevel.MEMORY_AND_DISK_SER
。下一次迭代使用此RDD
。因此RDD
的谱系变得非常大,因此需要缓存。但是,如果我正在缓存(并且溢出到磁盘)父母怎么会丢失?
答案 0 :(得分:5)
我引用Cloudera的Imran Rashid:
如果它们是随机地图阶段,可以多次读取,则跳过阶段是正常的。例如,这是我之前写的一个小例子程序,用于演示这个:“d3”不需要重新洗牌,因为每次读取同一个分区器。因此,以这种方式跳过阶段是一件好事:
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())
}
如果您运行此操作,如果您在UI中查看除了第一个作业之外的所有作业都有一个跳过的阶段。您还会在日志中看到这一点:
15/06/08 10: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/