火花中是否有"Explain RDD"
Is there an "Explain RDD" in spark
特别是,如果我说
rdd3 = rdd1.join(rdd2)
然后当我调用 rdd3.collect
时,根据所使用的 Partitioner
,要么在节点分区之间移动数据,要么在每个分区上本地完成连接(或者,据我所知,完全是别的东西)。
这取决于 RDD 论文中所说的 "narrow" 和 "wide" 依赖关系,但谁知道优化器在实践中有多好。
无论如何,我可以从跟踪输出中收集实际发生的事情,但最好调用 rdd3.explain
。
有这种东西吗?
我想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
在许多情况下甚至更好:)
我会尽可能使用 Spark UI(Spark 上下文用于服务的网页)而不是 toDebugString
。更容易理解,更多信息(根据我非常有限的经验,故障更少)。此外,Spark UI 显示每个阶段的任务数量及其输入和输出大小,这有助于弄清楚它的作用。
此外,两者显示的信息都很少。大多数情况下只是一个方框图表,上面写着 MapPartitionsRDD [12]
之类的内容,并不能说明该步骤的实际作用。 (对于 WholeStageCodegen
框,org.apache.spark.sql.execution
下的 DEBUG
日志至少包含生成的代码。但是没有记录任何类型的 ID 来将它们与您在 Spark UI 上看到的内容配对.)
特别是,如果我说
rdd3 = rdd1.join(rdd2)
然后当我调用 rdd3.collect
时,根据所使用的 Partitioner
,要么在节点分区之间移动数据,要么在每个分区上本地完成连接(或者,据我所知,完全是别的东西)。
这取决于 RDD 论文中所说的 "narrow" 和 "wide" 依赖关系,但谁知道优化器在实践中有多好。
无论如何,我可以从跟踪输出中收集实际发生的事情,但最好调用 rdd3.explain
。
有这种东西吗?
我想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
在许多情况下甚至更好:)
我会尽可能使用 Spark UI(Spark 上下文用于服务的网页)而不是 toDebugString
。更容易理解,更多信息(根据我非常有限的经验,故障更少)。此外,Spark UI 显示每个阶段的任务数量及其输入和输出大小,这有助于弄清楚它的作用。
此外,两者显示的信息都很少。大多数情况下只是一个方框图表,上面写着 MapPartitionsRDD [12]
之类的内容,并不能说明该步骤的实际作用。 (对于 WholeStageCodegen
框,org.apache.spark.sql.execution
下的 DEBUG
日志至少包含生成的代码。但是没有记录任何类型的 ID 来将它们与您在 Spark UI 上看到的内容配对.)