Datenverwaltung auf dem Rechner

Dask.distributed speichert die Ergebnisse von Aufgaben im verteilten Speicher der Arbeiterknoten. Der zentrale Scheduler verfolgt alle Daten auf dem Cluster und bestimmt, wann Daten freigegeben werden sollen. Abgeschlossene Ergebnisse werden in der Regel so schnell wie möglich aus dem Speicher gelöscht, um Platz für weitere Berechnungen zu schaffen. Das Ergebnis einer Aufgabe wird im Speicher gehalten, wenn eine der folgenden Bedingungen erfüllt ist:

1. ein Kunde hat eine Zukunft, die auf diese Aufgabe hinweist. Die Daten sollten im RAM bleiben, damit der Client die Daten bei Bedarf sammeln kann.
2.Die Aufgabe ist notwendig für laufende Berechnungen, die daran arbeiten, die endgültigen Ergebnisse der Futures zu erhalten. Diese Aufgaben werden entfernt, sobald keine laufenden Aufgaben mehr erforderlich sind.

Wenn Benutzer Future-Objekte oder persistente Sammlungen (die viele solcher Futures in ihrem .dask-Attribut enthalten) halten, heften sie diese Ergebnisse an den aktiven Speicher. Wenn Sie sich fragen was bedeutet freien Speicher löschen, dann sollten Sie unbedingt einige Artikel dazu lesen. Wenn der Benutzer Futures oder Sammlungen aus seinem lokalen Python-Prozess löscht, entfernt der Scheduler die zugehörigen Daten aus dem verteilten RAM. Aufgrund dieser Beziehung spiegelt der verteilte Speicher den Zustand des lokalen Speichers wider. Ein Benutzer kann verteilten Speicher auf dem Cluster freigeben, indem er persistierte Sammlungen in der lokalen Sitzung löscht.

Erstellen von Futures

Mann arbeitet draußen am Laptop

Die Submit- und Map-Methoden behandeln rohe Python-Funktionen. Die Berechnungs- und Persistenzmethoden verarbeiten Dask-Sammlungen wie Arrays, Taschen, verzögerte Werte und Dataframes. Die Streumethode sendet Daten direkt aus dem lokalen Prozess.

Bestehende Sammlungen

Aufrufe zu Client.compute oder Client.persist senden Aufgabengrafiken an den Cluster und geben zukünftige Objekte zurück, die auf bestimmte Ausgabeaufgaben verweisen. Compute gibt eine einzelne Zukunft pro Eingabe zurück, persist gibt eine Kopie der Sammlung zurück, wobei jeder Block oder jede Partition durch eine einzige Zukunft ersetzt wird. Kurz gesagt, verwenden Sie persist, um die vollständige Sammlung auf dem Cluster zu erhalten, und verwenden Sie Compute, wenn Sie ein kleines Ergebnis als einzelne Zukunft wünschen. Persist ist häufiger anzutreffen und wird bei Sammlungen oft wie folgt verwendet: Hinweis für Spark-Anwender: Dies unterscheidet sich von dem, was Sie gewohnt sind. Beharrlichkeit ist eine sofortige Maßnahme. Sie erhalten jedoch sofort die Kontrolle zurück, da die Berechnung im Hintergrund erfolgt. In diesem Beispiel erstellen wir eine Berechnung, indem wir CSV-Daten analysieren, Zeilen filtern und dann eine neue Spalte hinzufügen. Bis zu diesem Zeitpunkt ist alle Arbeit faul; wir haben gerade ein Rezept erstellt, um die Arbeit als Grafik im df-Objekt auszuführen. Wenn wir df = client.persist(df) aufrufen, schneiden wir dieses Diagramm vom df-Objekt ab, senden es an den Scheduler, empfangen dafür Future-Objekte und erstellen einen neuen Datenrahmen mit einem sehr flachen Diagramm, das direkt auf diese Futures zeigt. Dies geschieht mehr oder weniger sofort (solange es dauert, bis der Graph serialisiert und gesendet wird) und wir können mit der Arbeit an unserem neuen df-Objekt fortfahren, während der Cluster arbeitet, um den Graphen im Hintergrund auszuwerten.

Unterschied zu dask.compute

Die Operationen client.persist(df) und client.compute(df) sind asynchron und unterscheiden sich daher von der traditionellen df.compute()-Methode oder der dask.compute-Funktion, die blockiert, bis ein Ergebnis vorliegt. Die Methode .compute() speichert keine Daten auf dem Cluster. Die Methode .compute() bringt auch das gesamte Ergebnis zurück auf die lokale Maschine, so dass es unklug ist, es für große Datensätze zu verwenden. .compute() ist jedoch sehr praktisch für kleinere Ergebnisse, insbesondere weil es konkrete Ergebnisse in einer Weise liefert, die die meisten anderen Tools erwarten. Normalerweise verwenden wir asynchrone Methoden wie client.persist, um große Sammlungen einzurichten, und verwenden dann df.compute() für schnelle Analysen.

Daten löschen

Wir entfernen Daten von verteilten RAMs, indem wir die Sammlung aus unserem lokalen Prozess entfernen. Ferndaten werden entfernt, sobald alle Futures, die auf diese Daten hinweisen, von allen Client-Computern entfernt wurden. Wenn dies die einzige Kopie ist, wird dies wahrscheinlich dazu führen, dass der Cluster auch die Daten löscht. Wenn wir jedoch mehrere Kopien oder andere Sammlungen haben, die auf dieser basieren, dann müssen wir sie alle löschen.

Aggressives Löschen von Daten

Um eine Berechnung und alle davon abhängigen Berechnungen endgültig zu entfernen, können Sie die Futures/Sammlung jederzeit stornieren. Alternativ können Sie den Cluster auch neu starten, wenn Sie einen Clean Slate wünschen. Dadurch wird der gesamte Status gelöscht und ein harter Neustart aller Arbeitsprozesse durchgeführt. Sie ist in der Regel in etwa einer Sekunde abgeschlossen.

Belastbarkeit

Die Ergebnisse werden nicht absichtlich kopiert, es sei denn, dies ist für Berechnungen auf anderen Arbeiterknoten erforderlich. Die Resilienz wird durch Rekomputation erreicht, indem die Herkunft eines jeden Ergebnisses beibehalten wird. Wenn ein Arbeiterknoten ausfällt, kann der Planer alle seine Ergebnisse neu berechnen. Der vollständige Graph für jede gewünschte Zukunft wird beibehalten, bis keine Hinweise auf diese Zukunft vorliegen. Weitere Informationen finden Sie unter Resilienz.

Fortgeschrittene Techniken

Das Ergebnis einer Aufgabe wird zunächst nicht absichtlich kopiert, sondern bleibt nur auf dem Knoten bestehen, auf dem sie ursprünglich berechnet oder verstreut wurde. Das Ergebnis kann jedoch im Rahmen der normalen Berechnung auf einen anderen Arbeiterknoten kopiert werden, wenn dieses Ergebnis von einer anderen Aufgabe benötigt wird, die von einem anderen Arbeiter ausgeführt werden soll. Dies geschieht, wenn eine Aufgabe zwei Daten auf verschiedenen Maschinen benötigt (mindestens eine muss sich bewegen) oder durch Arbeitsraub. In diesen Fällen ist es die Richtlinie für die zweite Maschine, ihre redundante Kopie der Daten beizubehalten. Dies trägt dazu bei, dass sich die Daten, die sehr gefragt sind, organisch verteilen. Fortgeschrittene Benutzer können jedoch den Speicherort, die Replikation und den Abgleich von Daten im gesamten Cluster direkter steuern. Sie können im Voraus wissen, dass bestimmte Daten im gesamten Netz übertragen werden sollten oder dass ihre Daten besonders unausgewogen sind oder dass sie möchten, dass bestimmte Daten in bestimmten Teilen ihres Netzes leben. Diese Überlegungen sind in der Regel nicht notwendig.