Ich versuche, die Ausführungszeit jeder mapPartition Operation an einem RDD mit einem Code wie folgt (in Scala) zu protokollieren:Apache Funken mapPartition seltsame Verhalten (lazy evaluation?)
rdd.mapPartitions{partition =>
val startTime = Calendar.getInstance().getTimeInMillis
result = partition.map{element =>
[...]
}
val endTime = Calendar.getInstance().getTimeInMillis
logger.info("Partition time "+(startTime-endTime)+ "ms")
result
}
Das Problem ist, dass es protokolliert die "Partitionszeit" sofort, bevor sie mit der Ausführung der Map-Operation beginnt, so dass ich immer eine Zeit von 2 ms bekomme.
Ich bemerkte es durch das Spark Web UI, in der Protokolldatei erscheint die Zeile bezüglich der Ausführungszeit unmittelbar nach dem Start der Aufgabe, nicht am Ende wie erwartet.
Jemand ist in der Lage, mir zu erklären, warum? Innerhalb der mapPartitions sollte der Code linear ausgeführt werden, oder ich falsch liegen?
Dank
Grüße Luca
Transformationen werden langsam ausgewertet. – philantrovert
Ok, danke! Ich löste das Setzen einer "result.size" vor der endTime. Ich dachte, dass die Karte innerhalb der mapPartitions, die eine Scala-Operation ist, standardmäßig nicht faul war. – Gaglia88
@philantrovert Nein, das ist nicht der Grund, Karte in mapPartitions ist keine Spark-Transformation, das ist reine scala-bezogene –