2017-02-15 2 views

Antwort

3

Die kurze Antwort ist nein, es muss nicht threadsicher sein.

Der Grund dafür ist, dass Spark die Daten zwischen Partitionen teilt. Es erstellt dann eine Aufgabe für jede Partition und die Funktion, die Sie schreiben, würde innerhalb dieser bestimmten Partition als eine Einzel-Thread-Operation ausgeführt werden (d. H. Kein anderer Thread würde auf dieselben Daten zugreifen).

Das heißt, Sie müssen sicherstellen, dass Sie Thread "unsicherheit" nicht manuell erstellen, indem Sie auf Ressourcen zugreifen, die nicht die RDD-Daten sind. Wenn Sie beispielsweise ein statisches Objekt erstellen und auf dieses zugreifen, kann dies zu Problemen führen, da mehrere Tasks möglicherweise im selben Executor (JVM) ausgeführt werden und ebenfalls darauf zugreifen. Das heißt, Sie sollten so etwas zunächst nicht tun, wenn Sie nicht genau wissen, was Sie tun ...

-3

Wenn Sie das tun "rdd.mapPartitions (funk)", die func ausführen kann tatsächlich in einem anderen jvm !!! Der Thread hat in JVM keine Bedeutung.

Wenn Sie im lokalen Modus arbeiten und globale Status- oder Thread-unsichere Funktionen verwenden, funktioniert der Job möglicherweise wie erwartet, aber das Verhalten ist nicht definiert oder wird nicht unterstützt.

1

Jede Funktion, die an die mapPartitions übergeben wird (oder eine andere Aktion oder Transformation) muss threadsicher sein. Spark on JVM (dies gilt nicht unbedingt für Gastsprachen) verwendet Executor-Threads und garantiert keine Isolierung zwischen einzelnen Tasks.

Dies ist besonders wichtig, wenn Sie Ressourcen verwenden, die in der Funktion nicht initialisiert, aber mit dem Closure übergeben werden, wie z.

Es versteht sich von selbst, dass Sie keines der Argumente ändern sollten, außer es ist explizit erlaubt.

Verwandte Themen