Dies kann eine dumme Frage sein. Allerdings würde ich gerne wissen, ob ich so etwas habe - rdd.mapPartitions(func)
. Soll die Logik in func
threadsicher sein?Soll die Logik der Spark-Transformation und -Aktion threadsicher sein?
Dank
Dies kann eine dumme Frage sein. Allerdings würde ich gerne wissen, ob ich so etwas habe - rdd.mapPartitions(func)
. Soll die Logik in func
threadsicher sein?Soll die Logik der Spark-Transformation und -Aktion threadsicher sein?
Dank
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 ...
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.
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.
Da RDD-Operationen immer unveränderlich sind, ist das Thread-Sicherheitsproblem für die zugrunde liegende Funktion, die RDD transformiert, nicht relevant. –