Пользовательский интерфейс spark показывает три этапа, а toDebugString показывает три уровня отступа, даже если исходный RDD кэшируется.
У меня есть очень простая маленькая искровая программа, которую я использовал, чтобы лучше понять, как устанавливаются границы этапа:
import org.apache.spark.rdd.RDD
val sc = spark.sparkContext
val rdd1 = sc.parallelize(Seq(
("math", 55),
("math", 56),
("english", 57),
("english", 58),
("science", 59),
("science", 54)))
rdd1.cache()
val result = rdd1.join(rdd1)
result.collect()
result.toDebugString
Если я вызываю toDebugString на моем rdd, я вижу три уровня отступа:
scala> result.toDebugString
res11: String =
(8) MapPartitionsRDD[19] at join at <console>:31 []
| MapPartitionsRDD[18] at join at <console>:31 []
| CoGroupedRDD[17] at join at <console>:31 []
+-(8) ParallelCollectionRDD[16] at parallelize at <console>:31 []
| | CachedPartitions: 8; MemorySize: 736.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 0.0 B
+-(8) ParallelCollectionRDD[16] at parallelize at <console>:31 []
| CachedPartitions: 8; MemorySize: 736.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 0.0 B
Мне интересно, почему этот искровой фрагмент потребовал три этапа вместо двух. Я бы подумал, что мне нужно
- один этап для подготовки ввода (который я использую дважды в соединении, но который кэшируется, поэтому я не понимаю, почему у меня есть два вхождения этапа ParallelCollectionRDD)
- другая стадия, вызванная использованием соединения, которое вводит границу тасования.
Любое объяснение или разъяснение будет приветствоваться!