我有一个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 任务,其中大多数任务完成得非常快,并且毫不奇怪,不会产生任何输出:
实际上,生成了80个输出文件,其中除了18个之外的所有文件都是空的。我的问题是,在这个阶段,其他80 - 18 = 62个任务是做什么的,为什么它们会被生成?
答案 0 :(得分:1)
您使用SparkContext.parallelize
而不提供numSlices
参数,因此Spark使用的defaultParallelism
可能是80.通常parallelize
尝试在分区之间统一传播数据,但它不会#&# 39; t删除空的,所以如果你想避免执行空任务,你应该将numSlices
设置为小于或等于runConfigs.size
的数字。