Wann sind Akkus wirklich zuverlässig?
Ich möchte einen Akku verwenden, um Statistiken zu den Daten zu sammeln, die ich in einem Spark-Job bearbeite. Idealerweise würde ich das tun, während der Job die erforderlichen Transformationen berechnet, aber da Spark Aufgaben in verschiedenen Fällen neu berechnet, würden die Akkumulatoren keine echten Metriken widerspiegeln. In der Dokumentation wird dies folgendermaßen beschrieben:
Bei Akkumulatoraktualisierungen, die nur innerhalb von Aktionen durchgeführt werden, garantiert Spark, dass die Aktualisierung jedes Tasks auf den Akku nur einmal angewendet wird, d. H., Neu gestartete Tasks aktualisieren den Wert nicht. Bei Transformationen sollten Benutzer beachten, dass die Aktualisierung jeder Aufgabe mehr als einmal angewendet werden kann, wenn Aufgaben oder Auftragsphasen erneut ausgeführt werden.
Das ist verwirrend, da die meistenAktione erlauben nicht das Ausführen von benutzerdefiniertem Code (wo Akkumulatoren verwendet werden können), sie nehmen meist die Ergebnisse früherer Transformationen (träge). Die Dokumentation zeigt auch dies:
val acc = sc.accumulator(0)
data.map(x => acc += x; f(x))
// Here, acc is still 0 because no actions have cause the `map` to be computed.
Aber wenn wir hinzufügendata.count()
Wäre dies am Ende garantiert korrekt (ohne Duplikate) oder nicht? Deutlichacc
wird nicht "nur innerhalb von Aktionen" verwendet, da map eine Transformation ist. Es sollte also nicht garantiert werden.
Die Diskussion über verwandte Jira-Tickets bezieht sich hingegen eher auf "Ergebnisaufgaben" als auf "Aktionen". Zum BeispielHie undHie. Dies scheint darauf hinzudeuten, dass das Ergebnis tatsächlich korrekt ist, da wir @ verwendeacc
unmittelbar vor und Aktion und sollte daher als eine einzige Stufe berechnet werden.
Ich vermute, dass dieses Konzept einer "Ergebnisaufgabe" mit der Art der Vorgänge zu tun hat. Es ist die letzte, die eine Aktion enthält, wie in diesem Beispiel, die zeigt, wie mehrere Vorgänge in Stufen unterteilt sind (in Magenta) , Bild von @ genommHie):
So hypothetisch, eincount()
Aktion am Ende dieser Kette wäre Teil der gleichen Endphase, und ich würde garantiert, dass die auf der letzten Karte verwendeten Akkumulatoren keine Duplikate enthalten?
Erklärung zu diesem Thema wäre toll! Vielen Dank