Amazon ec2 Apache Spark调度程序缺少阶段的父级

Amazon ec2 Apache Spark调度程序缺少阶段的父级,amazon-ec2,apache-spark,rdd,Amazon Ec2,Apache Spark,Rdd,在Apache Spark上运行迭代程序时,我偶尔会收到以下消息: INFO scheduler.DAGScheduler: Missing parents for Stage 4443: List(Stage 4441, Stage 4442) 我推测这意味着它需要计算父级RDD——但我不是100%确定。我不只是得到其中一个,我最终得到100个,如果不是一次数千个的话-它完全减慢了我的程序,另一个迭代在10-15分钟内没有完成(通常需要4-10秒) Icache在每次迭代中使用Storage

在Apache Spark上运行迭代程序时,我偶尔会收到以下消息:

INFO scheduler.DAGScheduler: Missing parents for Stage 4443: List(Stage 4441, Stage 4442)
我推测这意味着它需要计算父级
RDD
——但我不是100%确定。我不只是得到其中一个,我最终得到100个,如果不是一次数千个的话-它完全减慢了我的程序,另一个迭代在10-15分钟内没有完成(通常需要4-10秒)


I
cache
在每次迭代中使用
StorageLevel.MEMORY\u和\u DISK\u SER
缓存主
RDD
。下一次迭代使用这个
RDD
。因此,
RDD
的血统变得非常庞大,因此需要缓存。但是,如果我正在缓存(并溢出到磁盘),如何才能丢失父级?

我引用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信息:最后阶段的家长:列表(第12阶段,第13阶段)

15/06/08 10:52:37信息:失踪父母:名单(第13阶段)

诚然,这还不是很清楚,但这在某种程度上表明DAGScheduler首先创建了第12阶段作为一个必要的步骤,然后后来改变了主意,意识到第12阶段所需的一切都已经存在,因此没有什么可做的

有关电子邮件来源,请参见以下内容:

好的,谢谢!但是为什么它会减慢程序的速度呢?我自己对具有长沿袭的迭代程序的经验是,每10-15次迭代都需要检查点。检查点将使该迭代花费1.5--2倍的时间(您正在将文件写入SPARK_checkpoint_DIR中的持久存储),但会加快接下来的几次迭代。我在迭代程序中遇到的另一个问题是,最初没有缓存一个RDD,因此重用这个RDD会触发后续RDD沿袭图中的递归,从而导致后续迭代永远无法完成。如果你在血统中的某个地方有这样一个RDD,它可能会发生。