Wie sendet Spark Schließungen an Arbeiter?

9

Wenn ich eine RDD-Transformation schreibe, z.

%Vor%

Ich verstehe, dass die Schließung ( x => x * 3 ), die einfach eine Function1 ist, serialisierbar sein muss und Ich glaube, ich habe irgendwo gelesen EDIT: es ist genau dort in der Dokumentation impliziert: Ссылка dass es an die Arbeiter "gesendet" wird zur Ausführung. (z. B. sendet Akka einen "ausführbaren Code" an den Arbeiter, um ihn auszuführen)

Funktioniert das so?

Jemand bei einem Treffen, an dem ich teilgenommen habe, hat kommentiert und gesagt, dass es eigentlich keinen serialisierten Code sendet, aber da jeder Worker eine "Kopie" des Jars erhält, braucht es nur einen Hinweis darauf, welche Funktion ausgeführt werden soll oder so ähnlich (aber ich bin mir nicht sicher, ob ich diese Person richtig zitiere)

Ich bin jetzt völlig verwirrt darüber, wie es tatsächlich funktioniert.

Also meine Fragen sind

  1. Wie werden Transformationsschließungen an Arbeitnehmer gesendet? Serialisiert über akka? oder sie sind "schon da", weil der Funke das gesamte Überglas an jeden Arbeiter sendet (klingt für mich unwahrscheinlich ...)

  2. Wenn ja, wie wird dann der Rest des Glases an die Arbeiter geschickt? ist das, was die "cleanupClosure" tut? z.B. Senden nur den relevanten Bytecode an den Arbeiter anstelle des gesamten Überarschs? (z. B. nur abhängiger Code zum Abschluss?)

  3. zusammenfassend, synchronisiert Funken an irgendeinem Punkt die Gläser im Klassenpfad --jars irgendwie mit den Arbeitern? Oder sendet es den Mitarbeitern "genau die richtige Menge" an Code? und wenn es Schließungen sendet, werden sie für die Notwendigkeit der Neuberechnung zwischengespeichert? Oder sendet es die Schließung mit der Aufgabe jedes Mal, wenn eine Aufgabe geplant ist? Entschuldigung, wenn das dumme Fragen sind, aber ich weiß es wirklich nicht.

Bitte fügen Sie Quellen hinzu, wenn Sie für Ihre Antwort können, ich konnte es nicht explizit in der Dokumentation finden, und ich bin zu vorsichtig, um zu versuchen, es nur durch das Lesen des Codes abzuschließen.

    
Eran Medan 14.08.2015, 17:22
quelle

1 Antwort

2

Die Closures werden zur Laufzeit mit Sicherheit serialisiert. Ich habe viele Instanzen gesehen Closure nicht Serializable Ausnahmen zur Laufzeit - von Pyspark und von Scala. Es gibt einen komplexen Code namens

Von ClosureCleaner.scala

%Vor%

versucht, den zu serialisierenden Code zu minimieren. Der Code wird dann über die Leitung gesendet - wenn er serialisierbar wäre. Andernfalls wird eine Ausnahme ausgelöst.

Hier ist ein weiterer Auszug aus ClosureCleaner, um die Möglichkeit zu überprüfen, eine eingehende Funktion zu serialisieren:

%Vor%     
javadba 15.08.2015 01:31
quelle

Tags und Links