it-swarm.com.de

So legen Sie den Apache Spark Executor-Speicher fest

Wie kann ich den für Apache Spark Executor-Knoten verfügbaren Speicher erhöhen?

Ich habe eine 2 GB-Datei, die zum Laden in Apache Spark geeignet ist. Ich lasse Apache Spark momentan auf einem Rechner laufen, also befinden sich Treiber und Executor auf demselben Rechner. Das Gerät verfügt über 8 GB Speicher. 

Wenn ich versuche, die Zeilen der Datei zu zählen, nachdem die Datei im Arbeitsspeicher zwischengespeichert wurde, erhalte ich folgende Fehler:

2014-10-25 22:25:12 WARN  CacheManager:71 - Not enough space to cache partition rdd_1_1 in memory! Free memory is 278099801 bytes.

Ich habe mir die Dokumentation here angesehen und spark.executor.memory in 4g auf $SPARK_HOME/conf/spark-defaults.conf gesetzt.

Die Benutzeroberfläche zeigt, dass diese Variable in der Spark-Umgebung festgelegt ist. Sie finden den Screenshot hier

Wenn ich jedoch auf die Registerkarte " Executor" gehe, ist das Speicherlimit für meinen einzelnen Executor immer noch auf 265,4 MB gesetzt. Ich bekomme auch immer noch den gleichen Fehler. 

Ich habe verschiedene Dinge ausprobiert here , aber ich bekomme immer noch den Fehler und habe keine klare Vorstellung, wo ich die Einstellung ändern soll. 

Ich führe meinen Code interaktiv von der spark-Shell aus

97
WillamS

Da Sie Spark im lokalen Modus ausführen, hat die Einstellung spark.executor.memory, Wie Sie bemerkt haben, keine Auswirkung Treiber-JVM-Prozess, den Sie beim Starten von spark-Shell starten, und der dafür verwendete Standardspeicher ist 512M . Sie können dies erhöhen, indem Sie spark.driver.memory Auf einen höheren Wert setzen, zum Beispiel 5g . Sie können dies tun von entweder:

  • festlegen in der Eigenschaftendatei (Standard ist spark-defaults.conf),

    spark.driver.memory              5g
    
  • oder durch Angabe der Konfigurationseinstellung zur Laufzeit

    $ ./bin/spark-Shell --driver-memory 5g
    

Beachten Sie, dass dies nicht durch Festlegen in der Anwendung erreicht werden kann, da es zu diesem Zeitpunkt bereits zu spät ist und der Prozess bereits mit einer gewissen Menge an Speicher gestartet wurde.

Der Grund für 265,4 MB ist, dass Spark spark.storage.memoryFraction * spark.storage festlegt. safetyFraction auf die Gesamtgröße des Speichers und standardmäßig 0,6 und 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Beachten Sie daher, dass nicht der gesamte Treiberspeicher für den RDD-Speicher verfügbar ist.

Wenn Sie dies jedoch in einem Cluster ausführen, übernimmt die Einstellung spark.executor.memory Die Berechnung des Betrags, der für den Spark-Speichercache reserviert werden soll.

166
Grega Kešpret

Beachten Sie auch, dass Sie für den lokalen Modus die Größe des Treiberspeichers einstellen müssen, bevor Sie jvm starten:

bin/spark-submit --driver-memory 2g --class your.class.here app.jar

Dadurch wird die JVM mit 2G anstelle des Standard-512M gestartet.
Details hier :

Für den lokalen Modus haben Sie nur einen Executor, und dieser Executor ist Ihr Treiber. Daher müssen Sie statt dessen den Speicher des Treibers einstellen. * Das heißt, im lokalen Modus wurde zum Zeitpunkt der Ausführung von spark-submit bereits eine JVM mit den Standardspeichereinstellungen gestartet, sodass das Setzen von "spark.driver.memory" in Ihrer Konfiguration nicht wirklich etwas für Sie tut. Stattdessen müssen Sie spark-submit wie folgt ausführen

33

Anscheinend sagt die Frage nie, im lokalen Modus zu laufen, nicht im Garn. Irgendwie konnte ich nicht bekommen, dass spark-default.conf funktioniert. Stattdessen habe ich es versucht und es hat für mich funktioniert

bin/spark-Shell --master yarn --num-executors 6  --driver-memory 5g --executor-memory 7g

(Executor-Speicher konnte nicht auf 8g erhöht werden, da die Konfiguration des Garns eingeschränkt ist.)

2
Somum

Sie müssen den Treiberspeicher erhöhen. Auf einem Mac (d. H. Wenn Sie auf einem lokalen Master ausgeführt werden) beträgt der Standardtreiberspeicher 1024M. Dem Executor werden somit standardmäßig 380 MB zugewiesen.

 Screenshot

Beim Erhöhen von [--driver-memory 2G] wurde der Executor-Speicher auf ~ 950 MB erhöht  enter image description here

2
Sanchay

erstellen Sie eine Datei mit dem Namen spark-env.sh im Verzeichnis spark/conf, und fügen Sie diese Zeile hinzu

SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor
1

Sie können den Befehl anhand des folgenden Beispiels erstellen 

 spark-submit    --jars /usr/share/Java/postgresql-jdbc.jar    --class com.examples.WordCount3  /home/vaquarkhan/spark-scala-maven-project-0.0.1-SNAPSHOT.jar --jar  --num-executors 3 --driver-memory 10g **--executor-memory 10g** --executor-cores 1  --master local --deploy-mode client  --name wordcount3 --conf "spark.app.id=wordcount" 
0
vaquar khan

Die Antwort von Grega hat mir geholfen, mein Problem zu lösen. Ich führe Spark lokal über ein Python-Skript in einem Docker-Container aus. Ursprünglich trat bei der Verarbeitung einiger Daten in Spark ein Java-Fehler auf, weil nicht genügend Speicher vorhanden war. Ich konnte jedoch mehr Speicher zuweisen, indem ich meinem Skript die folgende Zeile hinzufügte:

conf=SparkConf()
conf.set("spark.driver.memory", "4g") 

Hier ist ein vollständiges Beispiel für das Python-Skript, mit dem ich Spark starte:

import os
import sys
import glob

spark_home = '<DIRECTORY WHERE SPARK FILES EXIST>/spark-2.0.0-bin-hadoop2.7/'
driver_home = '<DIRECTORY WHERE DRIVERS EXIST>'

if 'SPARK_HOME' not in os.environ:
    os.environ['SPARK_HOME'] = spark_home 

SPARK_HOME = os.environ['SPARK_HOME']

sys.path.insert(0,os.path.join(SPARK_HOME,"python"))
for lib in glob.glob(os.path.join(SPARK_HOME, "python", "lib", "*.Zip")):
    sys.path.insert(0,lib);

from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.sql import SQLContext

conf=SparkConf()
conf.set("spark.executor.memory", "4g")
conf.set("spark.driver.memory", "4g")
conf.set("spark.cores.max", "2")
conf.set("spark.driver.extraClassPath",
    driver_home+'/jdbc/postgresql-9.4-1201-jdbc41.jar:'\
    +driver_home+'/jdbc/clickhouse-jdbc-0.1.52.jar:'\
    +driver_home+'/mongo/mongo-spark-connector_2.11-2.2.3.jar:'\
    +driver_home+'/mongo/mongo-Java-driver-3.8.0.jar') 

sc = SparkContext.getOrCreate(conf)

spark = SQLContext(sc)
0
Sarah

sie haben erwähnt, dass Sie Ihren Code interaktiv auf spark-Shell ausführen. Wenn also kein richtiger Wert für den Treiberspeicher oder den Executor-Speicher festgelegt ist, weisen Sie dem Spark standardmäßig einen Wert zu, der auf seiner Eigenschaftendatei basiert (wobei der Standardwert ist erwähnt werden).

Ich hoffe, Sie wissen, dass es einen Treiber (Master-Knoten) und einen Worker-Knoten gibt (wo Executoren erstellt und verarbeitet werden). Daher werden vom Spark-Programm grundsätzlich zwei Arten von Speicherplatz benötigt, also wenn Sie festlegen möchten Treiberspeicher dann beim Start von spark-Shell.

spark-Shell --driver-memory "Ihr Wert" und zum Festlegen des Executor-Speichers: spark-Shell --executor-memory "Ihr Wert"

dann denke ich, dass Sie gut mit dem gewünschten Wert des Speichers gehen können, den Ihre spark-Shell verwenden soll.

0
A.Mishra

Der Spark-Executor-Speicher ist für die Ausführung Ihrer Spark-Aufgaben auf der Grundlage der Anweisungen Ihres Treiberprogramms erforderlich. Grundsätzlich sind mehr Ressourcen erforderlich, die von Ihrem eingereichten Job abhängen.

Der Executor-Speicher enthält Speicher, der für die Ausführung der Tasks erforderlich ist, sowie einen Overhead-Speicher, der nicht größer sein darf als die Größe der JVM und die maximale Containergröße des Garns. 

Fügen Sie die folgenden Parameter in spark-defaults.conf hinzu

spar.executor.cores=1

spark.executor.memory=2g

Wenn Sie Clusterverwaltungstools wie cloudera manager oder amabari verwenden, aktualisieren Sie die Clusterkonfiguration, um die neuesten Konfigurationen für alle Knoten im Cluster anzuzeigen.

Alternativ können wir den Executor-Kern und den Speicherwert als Argument übergeben, während der Befehl spark-submit zusammen mit der Klasse und dem Anwendungspfad ausgeführt wird.

Beispiel:

spark-submit \

  --class org.Apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000
0