So definieren Sie eine Globale Lesen\schreiben von Variablen in Spark
Funke hat broadcast
Variablen, die nur gelesen werden, und accumulator
Variablen, die updates von den Knoten, aber nicht Lesen. Ist es Weg oder einen workaround - eine variable definieren, die sowohl aktualisiert und gelesen werden können?
Eine Voraussetzung für das Lesen\schreiben von globalen Variablen wäre die Umsetzung in einem cache. Als Dateien werden geladen und verarbeitet, wie der rdd ist, Berechnungen durchgeführt werden. Die Ergebnisse dieser Berechnungen geschieht in mehreren Knoten parallel laufen - müssen gestellt werden, in eine Karte, die hat, wie es ist Schlüssel, dass einige Attribute in der Entität verarbeitet werden. Wie die nachfolgenden Elemente innerhalb der rdd ist, verarbeitet werden, wird der cache abgefragt.
Scala hat ScalaCache
, die eine Fassade für die cache-Implementierungen, wie Google Guava
. Aber wie würde so ein cache enthalten sein und der Zugriff innerhalb einer Spark-Applikation?
Den cache kann definiert werden als eine variable in der Treiber-Anwendung, die erstellt die SparkContext
. Aber dann würde es zwei Probleme:
- Leistung würde vermutlich schlecht werden, weil der Netzwerk-overhead
zwischen den Knoten und der Treiber-Anwendung. - Nach meinem Verständnis, die jeden rdd weitergegeben werden, eine Kopie der variable
(cache in diesem Fall), wenn die variable des ersten Zugriffs durch die
Funktion übergeben, rdd. Jeder rdd wäre es eine Kopie, nicht den Zugang zu einer gemeinsamen globalen Variablen .
Was ist der beste Weg, zu implementieren und zu speichern, solch einen cache?
Dank
- So definieren Sie eine Globale Lesen\schreiben von Variablen in Spark, z.B. für die Definition der cache, wie in meinem Beispiel.
- Dank Tzach - hinzufügen von neuen Kommentaren auf diese Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, der beste Weg, dies zu tun ist, nicht tun Sie alle. Im Allgemeinen Spark-processing-Modell bietet keine Garantien*) in Bezug auf
Stück code ausgeführt wird. Darüber hinaus werden keine updates, die sind direkt abhängig von der Spark-Architektur, sind nicht körnig ist.
Diese sind die Eigenschaften, die Funken skalierbar und elastisch, aber gleichzeitig ist dies die Sache, die macht zu halten shared mutable state sehr schwer zu implementieren und die meiste Zeit völlig nutzlos.
Wenn alle Sie wollen, ist ein einfacher cache, dann haben Sie mehrere Möglichkeiten:
Wenn die Anwendung erfordert sehr viel komplexer Kommunikation Sie können versuchen, verschiedene message-passing-tools zu halten synchronisiert Zustand, aber im Allgemeinen erfordert eine komplexe und potenziell fragile code.
* Dies teilweise geändert, Funke 2.4, die mit der Einführung der Barriere Ausführungsmodus (SPARK-24795, SPARK-24822).