2017-02-06 15 views
1

私はいくつかの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午後07時23分20秒INFOのSparkJob:18の異なる構成を実行しますコンフィグはショーが生成された直後にログ行。

パーティションごとの段階ごとに最大1つのタスク(少なくとも、それが私の理解だ)があるべきように私は、で最も 18タスクを期待したいです。

enter image description here

それらのすべてが、18が空の状態で生成された80の出力ファイルは実際にはあります。しかし、歴史サーバーは、非常に迅速に完了し、驚くべきことに、何も出力されませんほとんどがタスクを報告します。私の質問は、この段階で他の80 - 18 = 62の仕事は何ですか、なぜ彼らは生成されるのですか?

答えて

1

あなたはスパークは、おそらくパーティション間で均等にデータを分散するための一般的parallelize試行に80あるdefaultParallelismを使用しているので、numSlices引数を与えることなくSparkContext.parallelizeを使用しますが、あなたは、あなたがすべき空のタスクを実行しないようにしたいので、もしそれが空のものを削除しません。 numSlicesrunConfigs.size以下の数値に設定します。

関連する問題