2017-02-06 5 views
1

Ich habe ein Spark-Programm, das mehrere ML-Algorithmen trainiert. Der Code, der die letzte Phase meiner Arbeit erzeugt sieht wie folgt aus (in Kotlin):Wo sind meine zusätzlichen Spark Aufgaben von

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 eine Liste von 18 Einzelteile ist. Die Protokollzeile direkt nach der Generierung der Configs zeigt:

17/02/06 19:23:20 INFO SparkJob: Wird 18 verschiedene Konfigurationen ausführen.

Also würde ich höchstens 18 Aufgaben erwarten, da es höchstens eine Aufgabe pro Stufe pro Partition (zumindest das ist mein Verständnis) sein sollte. Allerdings berichtet die Geschichte Server Aufgaben von denen die meisten beenden sehr schnell und, nicht überraschend, erzeugen keine Ausgabe:

enter image description here

Es gibt in der Tat 80 Ausgabedateien erzeugt mit allen aber 18 von ihnen leer . Meine Frage ist, was machen die anderen 80 - 18 = 62 Aufgaben in dieser Phase und warum wurden sie generiert?

Antwort

1

Sie verwenden SparkContext.parallelize ohne Angabe numSlices Argument so Funke mit defaultParallelism ist die wahrscheinlich 80. Im Allgemeinen parallelize versucht, Daten gleichmäßig zwischen den Partitionen zu verbreiten, aber es entfernt nicht leer sind also, wenn Sie leer Aufgabe ausführen vermeiden möchten, sollten Sie Stellen Sie numSlices auf eine Nummer kleiner oder gleich runConfigs.size.

Verwandte Themen