Ich habe einige Code, der einige Schritte ausführt, und ich weiß, wie lange der gesamte Prozess dauert. Ich möchte jedoch gerne berechnen können, wie lange jede einzelne Transformation dauert. Hier sind einige einfache Beispiele für die Schritte:Wie kann man eine Transformation in Spark zeitlich verzögern?
rdd1 = sc.textFile("my/filepath/*").map(lambda x: x.split(","))
rdd2 = sc.textFile("other/filepath/*").map(lambda x: x.split(","))
to_kv1 = rdd1.map(lambda x: (x[0], x[1])) # x[0] is key, x[1] is numeric
to_kv2 = rdd2.map(lambda x: (x[0], x[1])) # x[0] is key, x[1] is numeric
reduced1 = to_kv1.reduceByKey(lambda a, b: a+b)
reduced2 = to_kv1.reduceByKey(lambda a, b: a+b)
outer_joined = reduced1.fullOuterJoin(reduced2) # let's just assume there is key overlap
outer_joined.saveAsTextFile("my_output")
Jetzt: Wie bench ich einen bestimmten Teil dieses Codes? Ich weiß, dass das Ausführen von Ende zu Ende eine gewisse Zeit in Anspruch nimmt (die saveAsTextFile
wird es zur Ausführung zwingen), aber wie benchmarkiere ich nur den reduceByKey
oder Teil des Codes? Ich weiß, dass ich count()
nach jeder Operation ausführen konnte, um Ausführung zu erzwingen, aber das würde die Operation nicht ordnungsgemäß benchmarken, da es die Zeit hinzufügt, die benötigt wird, um die count
sowie die Zeit auszuführen, die Transformation auszuführen.
Was ist der beste Weg, um Spark-Transformationen zu bewerten, angesichts ihrer faulen Ausführung?
Bitte beachten Sie, dass ich nicht frage, wie man Zeit misst. Ich weiß über das time
Modul, start = time.time()
, etc. Ich frage, wie Benchmark angesichts der faulen Ausführung Stil von Spark-Transformationen, die nicht ausgeführt werden, bis Sie eine Aktion aufrufen, die Informationen an den Treiber zurückgegeben werden benötigt.
Sie schreiben "Ich weiß über das Zeitmodul, start = time.time(), etc." was genau meinst du damit? Ich suche nach einer Möglichkeit, eine einzelne Transformation/eine Reihe von Transformationen zeitlich festzulegen. Vielen Dank! –
Wenn Sie eine Reihe von Ausführungen zeitlich abmessen wollen, die mit einer Aktion enden, die die Ausführung erzwingt, können Sie 'start = time.time()' zu Beginn, 'elapsed = time.time() - start' am Ende danach einfügen der Aktionsaufruf, und dann schauen, was "verstrichen" enthält. –