Apache spark 我额外的火花任务来自哪里

Apache spark 我额外的火花任务来自哪里,apache-spark,Apache Spark,我有一个Spark程序,它正在训练几个ML算法。生成作业最后阶段的代码如下所示(在Kotlin中): val runConfigs=buildoptions交叉产品(opts) log.info(“将运行{}个不同的配置。”,runConfigs.size) val runConfigsRdd:JavaRDD=sc.parallelize(runConfigs) //创建一个RDD映射窗口大小到该窗口大小的分数。 val accuracyRdd=runConfigsRdd.mapToPair{r

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

val runConfigs=buildoptions交叉产品(opts)
log.info(“将运行{}个不同的配置。”,runConfigs.size)
val runConfigsRdd:JavaRDD=sc.parallelize(runConfigs)
//创建一个RDD映射窗口大小到该窗口大小的分数。
val accuracyRdd=runConfigsRdd.mapToPair{runConfig:RunConfiguration->
运行单一选项开始(运行配置、选项、训练广播、有效广播)}
accuracyRdd.saveAsTextFile(opts.output)
runConfigs
是一个包含18项的列表。生成配置后的日志行显示:

17/02/06 19:23:20信息火花作业:将运行18种不同的配置

因此,我希望最多18个任务,因为每个分区每个阶段最多应该有一个任务(至少这是我的理解)。但是,History server报告了80个任务,其中大多数任务完成得非常快,而且毫不奇怪,不会产生任何输出:


事实上,生成了80个输出文件,其中18个文件为空。我的问题是,这一阶段的其他80-18=62个任务在做什么?为什么会生成它们?

您使用
SparkContext.parallelize
而不提供
numSlices
参数,因此Spark使用的是
defaultParallelism
,可能是80。通常,
parallelize
尝试在分区之间均匀地分布数据,但它不会删除空分区,因此如果要避免执行空任务,应将
numSlices
设置为小于或等于
runConfigs.size
的数字

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)