Spark-cache vs broadcast
Sieht es aus wie broadcast-Methode macht eine verteilte Kopie von RDD in meinem cluster. Auf der anderen Seite die Ausführung von cache () - Methode lädt einfach Daten im Speicher.
Aber ich verstehe nicht, wie funktioniert zwischengespeichert RDD, verteilt im cluster.
Könnten Sie mir bitte sagen, in welchen Fällen sollte ich rdd.cache()
und rdd.broadcast()
Methoden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
RDDs sind unterteilt in Partitionen. Diese Partitionen dienen als einen unveränderlichen Teilmenge der gesamten RDD. Wenn Funke führt jeder Phase der Kurve, jede partition wird an einen Arbeiter, der arbeitet auf die Teilmenge der Daten. Wiederum, jeder Arbeiter kann cache die Daten, wenn das RDD Bedürfnisse zu re-iterieren.
Broadcast-Variablen werden verwendet, um senden Sie einige unveränderliche Zustand einmal auf jeden Arbeitnehmer. Sie verwenden Sie Sie, wenn Sie möchten, eine lokale Kopie der variable.
Diese beiden Vorgänge sind sehr Verschieden von einander, und jede stellt eine Lösung für ein anderes problem.
cache() oder persist() ermöglicht ein dataset verwendet werden, über Operationen.
Wenn Sie bestehen ein RDD, jeder Knoten speichert alle Partitionen aus, dass es berechnet im Speicher und verwendet Sie in anderen Aktionen, die auf das dataset (oder Datensätze daraus abgeleitet). Dadurch können zukünftige Aktionen werden viel schneller (oft mehr als 10-Fach). Caching ist ein wichtiges tool für die iterative algorithmen und schnelle interaktive Nutzung.
Jede permanenten RDD gespeichert werden kann, mit einem anderen Speicher-level, so dass Sie, zum Beispiel, weiterhin das dataset auf der Festplatte, bestehen es in Speicher aber als serialisierte Java-Objekte (um Speicherplatz zu sparen), zu replizieren über Knoten, oder speichern Sie es off-heap
Broadcast-Variablen erlauben es dem Programmierer, um eine schreibgeschützte variable zwischengespeichert wird auf jeder Maschine, statt dem Versand eine Kopie mit Aufgaben. Sie können zum Beispiel verwendet werden, um jedem Knoten eine Kopie eines großen Eingabe-dataset in einer effizienten Art und Weise. Funke, versucht es auch zum verteilen von broadcast-Variablen unter Verwendung der leistungsfähigen broadcast-algorithmen zur Reduktion von Kommunikationskosten.
Finden Sie weitere details zu diesem Dokumentation Seite.
Nützliche Beiträge:
Vorteil der Broadcast-Variablen
Was ist der Unterschied zwischen cache und bestehen?
Nehmen wir ein Beispiel, sagen wir angenommen du hast ein employee_salary Daten enthält, die Abteilung und das Gehalt jedes Mitarbeiters. Jetzt sagen die Aufgabe ist zu finden, dass der Anteil der durchschnittlichen Abteilungs-Gehalt für jeden Mitarbeiter. (Wenn für Mitarbeiter-e1 sein Abt d1, wir müssen herausfinden, e1.Lohn/Durchschnitt(alle Gehälter (d1)).
Nun ein Weg dies zu tun ist -- Sie Lesen Sie zuerst die Daten in eine rdd-sagen rdd1. Und dann noch so ein, zwei Dinge, eins nach dem anderen*-
Erste, berechnen Sie die Abteilung klug Gehalt Durchschnitt mit der rdd1*. Sie müssen eventuell die Abteilung, Durchschnittliche Gehälter führen-im Grunde genommen ein map-Objekt mit der deptId vs Durchschnitt-auf die Fahrer.
Zweite, die Sie benötigen, um dieses Ergebnis zu teilen das Gehalt für jeden Mitarbeiter durch Ihre jeweiligen Abteilung durchschnittlichen Gehalt. Denken Sie daran, dass auf jeden Arbeiter dort können die Mitarbeiter aus jeder Abteilung, so dass Sie brauchen, um Zugang zu der Abteilung weisen eine Durchschnittliche Gehaltssteigerung Ergebnis auf jeden Arbeitnehmer. Wie Sie dies tun? Nun, können Sie einfach senden Sie das Durchschnittliche Gehalt Karte, die Sie bekam, auf den Fahrer, der jedem Arbeiter in einer Sendung und es kann dann verwendet werden, bei der Berechnung der Lohn-Fraktionen für jede "Zeile" in der rdd1.
Was ist mit der Zwischenspeicherung ein RDD? Denken Sie daran, dass von der ersten rdd1, es gibt zwei Zweige der Berechnungen -- ein für die Berechnung der Abt klug, Durchschnitt und eine andere Anwendung diese Durchschnittswerte auf die einzelnen Mitarbeiter, die in der rdd. Nun, wenn Sie nicht im cache rdd1, dann für die zweite Aufgabe können Sie müssen gehen Sie zurück auf die Festplatte wieder zu Lesen und neu berechnen, weil spark möglicherweise vertrieben diese rdd aus dem Speicher durch die Zeit, die Sie diesen Punkt zu erreichen. Aber da wir wissen, dass wir mit der gleichen rdd, können wir verlangen, Funke, halten Sie es im Speicher das erste mal selbst. Dann müssen wir beim nächsten mal anwenden einige Transformationen auf, die wir schon haben, es im Gedächtnis.
*Wir verwenden können-Abt-basierte Partitionierung so können Sie vermeiden, die Sendung aber für den Zweck der Veranschaulichung, lassen Sie uns sagen, dass wir nicht.
Anwendungsfälle
Du cache oder broadcast-Objekt, wenn Sie es verwenden möchten, mehrere Male.
Können Sie nur Zwischenspeichern einer RDD oder RDD-Derivat, während Sie übertragen jede Art von Objekt, einschließlich RDDs.
Verwenden wir cache (), wenn wir den Umgang mit einer RDD/DataFrame/Datensatz und wir wollen das dataset mehrere Male ohne recomputing neu jedes mal.
Wir broadcast ein Objekt, wenn