问题 火花中是否有“解释RDD”


特别是,如果我说

rdd3 = rdd1.join(rdd2)

然后我打电话的时候 rdd3.collect,取决于 Partitioner 使用时,要么在节点分区之间移动数据,要么在每个分区上本地完成连接(或者,就我所知,完全不同的东西)。 这取决于RDD论文所谓的“狭义”和“广泛”依赖关系,但谁知道优化器在实践中有多好。

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

这样的事情存在吗?


10371
2018-05-11 15:01


起源



答案:


我认为 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 []

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

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


15
2018-05-11 15:39



这是一件美丽的事情 - Joseph Victor
这很有用,但它不是我希望的细节水平。特别是,需要/不需要shuffle的连接给出相同的toDebugString输出...虽然对于像distinct这样的东西我可以清楚地看到shuffle步骤。 - Joseph Victor
我认为我的意思是“实现了本地运行”,因为如果分区符合,则不应在节点之间发送数据。 - Joseph Victor
其中很多都是运行时优化......这是懒惰设计和DAG的乐趣 - Justin Pihony
你可以检查分区器吗? - Justin Pihony


答案:


我认为 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 []

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

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


15
2018-05-11 15:39



这是一件美丽的事情 - Joseph Victor
这很有用,但它不是我希望的细节水平。特别是,需要/不需要shuffle的连接给出相同的toDebugString输出...虽然对于像distinct这样的东西我可以清楚地看到shuffle步骤。 - Joseph Victor
我认为我的意思是“实现了本地运行”,因为如果分区符合,则不应在节点之间发送数据。 - Joseph Victor
其中很多都是运行时优化......这是懒惰设计和DAG的乐趣 - Justin Pihony
你可以检查分区器吗? - Justin Pihony


我会使用Spark UI(用于服务的spark上下文的网页)而不是 toDebugString 我什么时候能。更容易理解,更多信息(根据我非常有限的经验减少故障)。此外,Spark UI显示每个阶段的任务数量及其输入和输出大小,这有助于弄清楚它的作用。

此外,两者都显示的信息非常少。大多数情况下只是一个方块图表 MapPartitionsRDD [12] 等等,这并没有说明该步骤实际上做了什么。 (对于 WholeStageCodegen 盒子 DEBUG 登录 org.apache.spark.sql.execution 至少包含生成的代码。但是没有记录任何类型的ID来将它们与您在Spark UI上看到的内容配对。)


0
2017-08-03 10:43