我的额外Spark任务来自哪里

时间:2017-02-06 19:40:50

标签: apache-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 INFO SparkJob:将运行18种不同的配置。

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

您使用SparkContext.parallelize而不提供numSlices参数,因此Spark使用的defaultParallelism可能是80.通常parallelize尝试在分区之间统一传播数据,但它不会#&# 39; t删除空的,所以如果你想避免执行空任务,你应该将numSlices设置为小于或等于runConfigs.size的数字。