我的额外Spark任务来自哪里?

我有一个Spark程序正在训练几个ML算法。 生成我工作最后阶段的代码如下所示(在Kotlin中):

val runConfigs = buildOptionsCrossProduct(opts) log.info("Will run {} different configurations.", runConfigs.size) val runConfigsRdd: JavaRDD<RunConfiguration> = sc.parallelize(runConfigs) // Create an RDD mapping window size to the score for that window size. val accuracyRdd = runConfigsRdd.mapToPair { runConfig: RunConfiguration -> runSingleOptionSet(runConfig, opts, trainingBroadcast, validBroadcast) } accuracyRdd.saveAsTextFile(opts.output) 

runConfigs是一个包含18个项目的列表。 配置生成后的日志行显示:

17/02/06 19:23:20信息SparkJob:将运行18种不同的配置。

所以我预计最多有 18个任务,因为每个分区每个阶段至多应该有一个任务(至少这是我的理解)。 但是,历史记录服务器报告80个任务,其中大部分完成得非常快,毫不奇怪,不会产生任何输出:

在这里输入图像描述

实际上有80个输出文件,其中只有18个是空的。 我的问题是,这个阶段的其他80 – 18 = 62个任务是什么,他们为什么产生?

您使用SparkContext.parallelize而不提供numSlices参数,所以Spark使用的是大约80的defaultParallelism 。一般而言, parallelize尝试在分区之间均匀分布数据,但不会删除空分配,所以如果您想避免执行空任务,您应该设置numSlices到一个小于或等于runConfigs.size