在Apache Spark上运行我的迭代程序时,我偶尔会收到以下消息:
INFO scheduler.DAGScheduler: Missing parents for Stage 4443: List(Stage 4441, Stage 4442)
我猜这意味着它需要计算父RDD
-但我不是100%确定。我不只得到其中的一个,我结束了100个,如果不是数千个的话-它完全减慢了我的程序,并且另一个迭代在10-15分钟内不会完成(它们通常需要4-10秒)。
我使用StorageLevel.MEMORY_AND_DISK_SER
在每次迭代中cache
主RDD
。下一次迭代将使用此RDD
。因此,RDD
的谱系变得非常庞大,因此需要缓存。但是,如果我正在缓存(并溢出到磁盘),父级怎么会丢失?
发布于 2015-06-09 07:05:44
我引用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信息DAGScheduler:最终阶段的父母:列表(阶段12,阶段13)
15/06/08 10:52:37信息DAGScheduler:缺少父母:列表(阶段13)
诚然,这并不是很清楚,但这在某种程度上向你表明,DAGScheduler首先创建了阶段12作为必要的步骤,然后后来改变了主意,意识到阶段12所需的一切都已经存在,所以没有什么可做的。
有关电子邮件来源,请参阅以下内容:http://apache-spark-developers-list.1001551.n3.nabble.com/
https://stackoverflow.com/questions/29808309
复制相似问题