Spark UI DAG阶段已断开连接

时间:2016-11-16 15:56:36

标签: scala apache-spark

我在spark-shell中运行了以下工作:

val d = sc.parallelize(0 until 1000000).map(i => (i%100000, i)).persist
d.join(d.reduceByKey(_ + _)).collect

Spark UI显示了三个阶段。阶段4和5对应于d的计算,阶段6对应于collect动作的计算。由于d持续存在,我只期望两个阶段。但是,第5阶段不存在与任何其他阶段的关联。​​

Spark UI DAG

因此尝试在不使用持久性的情况下运行相同的计算,并且DAG看起来完全相同,除非没有指示RDD已被持久化的绿点。

Spark UI DAG without persist

我希望第11阶段的输出能够连接到第12阶段的输入,但事实并非如此。

查看阶段描述,这些阶段似乎表明d正在被持久化,因为阶段5有输入,但我仍然对第5阶段为什么存在感到困惑。

Spark UI stages

Spark UI stages without persist

2 个答案:

答案 0 :(得分:1)

  1. 缓存输入RDD,不重新计算缓存部分。

    这可以通过简单的测试验证:

    import org.apache.spark.SparkContext
    
    def f(sc: SparkContext) = {
      val counter = sc.longAccumulator("counter")
      val rdd = sc.parallelize(0 until 100).map(i => {
        counter.add(1L)
        (i%10, i)
      }).persist
      rdd.join(rdd.reduceByKey(_ + _)).foreach(_ => ())
      counter.value
    }
    
    assert(f(spark.sparkContext) == 100)
    
  2. 缓存不会从DAG中删除阶段。

    如果数据被缓存到相应的阶段can be marked as skipped,但仍然是DAG的一部分。可以使用检查点截断沿袭,但它不是一回事,也不会从可视化中删除阶段。

  3. 输入阶段包含的不仅仅是缓存计算。

    Spark阶段将可以链接的操作组合在一起而不执行随机播放。

    虽然输入阶段的一部分是缓存的,但它并未涵盖准备shuffle文件所需的所有操作。这就是为什么你没有看到跳过的任务。

  4. 其余(分离)只是图表可视化的限制。

  5. 如果您首先重新分区数据:

    import org.apache.spark.HashPartitioner
    
    val d = sc.parallelize(0 until 1000000)
      .map(i => (i%100000, i))
      .partitionBy(new HashPartitioner(20))
    
    d.join(d.reduceByKey(_ + _)).collect
    

    你会得到你最有可能寻找的DAG:

    enter image description here

答案 1 :(得分:0)

添加到user6910411的详细答案,RDD在第一个操作运行之前不会保留在内存中,并且由于对RDD的惰性评估,它会计算整个DAG。因此,当您第一次运行collect()时,RDD“d”第一次在内存中保留,但没有任何内容从内存中读取。如果第二次运行collect(),则会读取缓存的RDD。

另外,如果你在最终的RDD上执行toDebugString,它会显示以下输出:

    scala> d.join(d.reduceByKey(_ + _)).toDebugString
res5: String =
(4) MapPartitionsRDD[19] at join at <console>:27 []
 |  MapPartitionsRDD[18] at join at <console>:27 []
 |  CoGroupedRDD[17] at join at <console>:27 []
 +-(4) MapPartitionsRDD[15] at map at <console>:24 []
 |  |  ParallelCollectionRDD[14] at parallelize at <console>:24 []
 |  ShuffledRDD[16] at reduceByKey at <console>:27 []
 +-(4) MapPartitionsRDD[15] at map at <console>:24 []
    |  ParallelCollectionRDD[14] at parallelize at <console>:24 []

上面的粗略图形表示可以显示为:RDD Stages