pyspark Verteilen Python-Prozesse auf einem Executor-Knoten Broadcast-Variablen in ram?

8

Ich habe einen Knoten mit 24 Kernen und 124 Gb RAM in meinem Funkencluster. Wenn ich das Feld spark.executor.memory auf 4g setze und dann eine Variable ausstrahle, die 3,5 GB zur Speicherung im RAM benötigt, werden die Kerne insgesamt 24 Kopien dieser Variablen speichern? Oder eine Kopie?

Ich benutze pyspark - v1.6.2

    
ThatDataGuy 17.10.2016, 09:18
quelle

1 Antwort

6

Ich glaube, dass PySpark keine Form von Shared Memory verwendet, um Broadcast-Variablen zwischen den Arbeitern zu teilen.

Auf Unix-ähnlichen Systemen werden Broadcast-Variablen geladen in der Hauptfunktion des Worker, der nur nach dem Forking von aufgerufen wird Der Daemon ist also nicht vom übergeordneten Prozessbereich aus zugänglich.

Wenn Sie den Footprint der großen Variablen reduzieren möchten, ohne externen Service zu verwenden, würde ich empfehlen, dateibasierte Objekte mit Memory-Map zu verwenden. Auf diese Weise können Sie beispielsweise effizient NumPy-Arrays verwenden.

Im Gegensatz dazu teilen native (JVM) Spark-Anwendungen tatsächlich Broadcast-Variablen zwischen mehreren Executor-Threads auf einer einzelnen Executor-JVM.

    
user6910411 17.10.2016, 12:56
quelle