是否有"解释RDD"在火花

时间:2015-05-11 15:01:33

标签: apache-spark rdd

特别是,如果我说

rdd3 = rdd1.join(rdd2)

然后当我调用rdd3.collect时,根据所使用的Partitioner,数据在节点分区之间移动,或者在每个分区上本地完成连接(或者,就我所知,还有其他内容)完全)。 这取决于RDD论文所称的"缩小"和"宽"依赖关系,但谁知道优化器在实践中有多好。

无论如何,我可以从跟踪输出中收集实际发生的事情,但是调用rdd3.explain会很好。

这样的事情存在吗?

2 个答案:

答案 0 :(得分:17)

我认为toDebugString会安抚你的好奇心。

scala> val data = sc.parallelize(List((1,2)))
data: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[8] at parallelize at <console>:21

scala> val joinedData = data join data
joinedData: org.apache.spark.rdd.RDD[(Int, (Int, Int))] = MapPartitionsRDD[11] at join at <console>:23

scala> joinedData.toDebugString
res4: String =
(8) MapPartitionsRDD[11] at join at <console>:23 []
 |  MapPartitionsRDD[10] at join at <console>:23 []
 |  CoGroupedRDD[9] at join at <console>:23 []
 +-(8) ParallelCollectionRDD[8] at parallelize at <console>:21 []
 +-(8) ParallelCollectionRDD[8] at parallelize at <console>:21 []

每个缩进都是一个阶段,所以这应该分为两个阶段。

此外,优化器相当不错,但如果您使用1.3+作为优化器,我建议使用DataFrames,在许多情况下甚至更好:)

答案 1 :(得分:0)

我将尽可能使用Spark UI(Spark上下文用于提供服务的网页)代替toDebugString。更容易理解,而且信息更多(根据我的有限经验,故障也更少)。此外,Spark UI会显示每个阶段的任务数及其输入和输出大小,这有助于弄清其作用。

此外,它们两个中显示的信息很少。大多数情况下,只是一个带有MapPartitionsRDD [12]之类的方框图,并不能说明该步骤的实际作用。 (对于WholeStageCodegen框,DEBUG下的org.apache.spark.sql.execution日志至少包含生成的代码。但是,没有记录任何ID来将它们与您在Spark UI上看到的配对。)