Apache Spark - foreach-Vs foreachPartitions, Wann, Was?
Ich würde gerne wissen, ob die foreachPartitions
wird zu besserer Leistung führt, aufgrund einer höheren Ebene der Parallelität ist, im Vergleich zu den foreach
- Methode unter Berücksichtigung der Fall, in denen ich bin, die durch einen RDD
um einige Summen in eine Akkumulator-variable.
Du musst angemeldet sein, um einen Kommentar abzugeben.
foreach
auto ausführen der Schleife auf vielen Knoten.Aber manchmal möchte man einige Operationen auf jeden Knoten. Zum Beispiel, stellen Sie eine Verbindung zur Datenbank. Sie können nicht nur eine Verbindung, und übergeben es in die
foreach
Funktion: die Verbindung ist nur auf einem Knoten.Also mit
foreachPartition
können Sie eine Verbindung zur Datenbank auf die einzelnen Knoten vor der Ausführung der Schleife.foreach
undforeachPartitions
Aktionen.foreach(Funktion): Einheit
Hinweis: ändern von Variablen in anderen als Akkumulatoren außerhalb des
foreach()
möglicherweise nicht definiertes Verhalten zur Folge. Sehen Verständnis Verschlüsse für mehr details.Beispiel :
foreachPartition(Funktion): Einheit
Nutzung von
foreachPartition
Beispiele:Nutzung von
foreachPartition
mit sparkstreaming (dstreams) und kafka producerFazit :
Faustregel :
Auch... siehe Karte vs mappartitions, die hat ein ähnliches Konzept, aber Sie sind Transformationen.
Es ist wirklich nicht so viel Unterschied zwischen
foreach
undforeachPartitions
. Unter der Decke, alle, dieforeach
tut, ist den Aufruf der iterator istforeach
mithilfe der bereitgestellten Funktion.foreachPartition
nur gibt Ihnen die Gelegenheit, etwas zu tun außerhalb der Schleife den iterator in der Regel etwas teurer wie Spinnen eine Datenbank-Verbindung oder etwas entlang jenen Linien. Also, wenn Sie don ' T haben alles, was getan werden könnte, einmal für jeden Knoten iterator und wiederverwendet ganzen, dann würde ich vorschlagen, mitforeach
für verbesserte Klarheit und die Komplexität reduziert.Den
foreachPartition
bedeutet nicht, es ist pro Knoten Aktivität, sondern es wird ausgeführt, für jede partition und es ist möglich, dass Sie möglicherweise eine große Anzahl von partition im Vergleich zur Anzahl der Knoten in diesem Fall Ihre Leistung kann beeinträchtigt werden. Wenn Sie beabsichtigen, tun eine Aktivität auf node-Ebene die Lösung erklärt hier kann nützlich sein, es ist zwar nicht von mir getestetenforeachPartition
ist nur dann hilfreich, wenn Sie Durchlaufen die Daten, die Sie aggregieren von partition.Ein gutes Beispiel ist die Verarbeitung clickstreams pro Benutzer. Sie wollen, um zu löschen Sie Ihren cache Berechnung jedes mal, wenn Sie fertig sind einen Benutzer, der Strom der Ereignisse, aber halten Sie es zwischen den Datensätzen mit dem gleichen Benutzer an, um zu berechnen, einige user-Verhalten Erkenntnisse.