So legen Sie den Apache Spark Executor-Speicher fest


127

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 führe momentan Apache Spark auf einem Computer aus, sodass sich Treiber und Executor auf demselben Computer befinden. Das Gerät verfügt über 8 GB Speicher.

Wenn ich versuche, die Zeilen der Datei zu zählen, nachdem ich die zwischengespeicherte Datei im Speicher festgelegt habe, werden folgende Fehler angezeigt:

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 schaute auf die Dokumentation hier und setzen spark.executor.memoryauf 4gin$SPARK_HOME/conf/spark-defaults.conf

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

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

Ich habe verschiedene hier erwähnte Dinge ausprobiert , aber ich erhalte immer noch den Fehler und habe keine klare Vorstellung davon, wo ich die Einstellung ändern soll.

Ich führe meinen Code interaktiv über die Spark-Shell aus

Antworten:


185

Da Sie Spark im lokalen Modus ausführen, hat die Einstellung spark.executor.memorykeine Auswirkungen, wie Sie bemerkt haben. Der Grund dafür ist, dass der Worker innerhalb des Treiber-JVM-Prozesses "lebt", den Sie beim Starten der Spark-Shell starten, und der dafür verwendete Standardspeicher ist 512 MB . Sie können dies erhöhen, indem Sie einen spark.driver.memoryhöheren Wert einstellen , z. B. 5 g . Sie können dies entweder tun:

  • Festlegen in der Eigenschaftendatei (Standard ist $SPARK_HOME/conf/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 Speichermenge gestartet wurde.

Der Grund für 265,4 MB ist, dass Spark spark.storage.memoryFraction * spark.storage.safetyFraction der Gesamtmenge des Speicherplatzes zuweist und standardmäßig 0,6 und 0,9 beträgt.

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, wird die spark.executor.memoryEinstellung bei der Berechnung des Betrags übernommen, der für den Speichercache von Spark reserviert werden soll.


1
Entspricht 5 g 5 GB?
Chuck

@Chuck spark.apache.org/docs/latest/… "Speichermenge, die für den Treiberprozess verwendet werden soll, dh wo SparkContext initialisiert wird, im selben Format wie JVM-Speicherzeichenfolgen mit einem Größeneinheitssuffix (" k "," m "," g "oder" t ") (z. B. 512 m, 2 g).
James Moore

39

Beachten Sie auch, dass Sie für den lokalen Modus die Größe des Treiberspeichers festlegen 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 der Standard-512M gestartet.
Details hier :

Für den lokalen Modus haben Sie nur einen Executor, und dieser Executor ist Ihr Treiber. Sie müssen stattdessen den Speicher des Treibers festlegen. * Im lokalen Modus wurde jedoch zu dem Zeitpunkt, zu dem Sie spark-submit ausführen, bereits eine JVM mit den Standardspeichereinstellungen gestartet, sodass das Festlegen von "spark.driver.memory" in Ihrer Konfiguration nichts für Sie bedeutet. Stattdessen müssen Sie spark-submit wie folgt ausführen


5

Anscheinend sagt die Frage nie, im lokalen Modus zu laufen, nicht auf Garn. Irgendwie konnte ich die Änderung von spark-default.conf nicht zum Laufen bringen. Stattdessen habe ich es versucht und es hat bei mir funktioniert

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

(Der Executor-Speicher konnte nicht auf 8 g erhöht werden, da die Garnkonfiguration einige Einschränkungen aufweist.)


Das OP erwähnt, dass er eine einzelne Maschine verwendet.
Sharique Abdullah

Du machst das executor-memoryhöher als driver-memory?
Nimeresam

5

Die Antwort von Grega half mir, mein Problem zu lösen. Ich führe Spark lokal über ein Python-Skript in einem Docker-Container aus. Bei der Verarbeitung einiger Daten in Spark wurde anfangs ein Java-Fehler aufgrund von Speichermangel angezeigt. 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)

4

Sie müssen den Treiberspeicher erhöhen. Auf einem Mac (dh wenn er auf einem lokalen Master ausgeführt wird) beträgt der Standardtreiberspeicher 1024 MB. Standardmäßig werden dem Executor somit 380 MB zugewiesen.

Bildschirmfoto

Beim Erhöhen von [ --driver-memory 2G ] wurde der Executor-Speicher auf ~ 950 MB erhöht. Geben Sie hier die Bildbeschreibung ein


2

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
Genau, ich führe den Master mit konkreter Konfiguration aus, ich müsste nicht jedes Mal Optionen hinzufügen, wenn ich einen Spark-Befehl ausführe. Dies gilt jedoch nur für Clusterknoten, falls diese eigenständig sind SPARK_WORKER_MEMORY.
Evhz

1

Sie können einen 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" 

1

Der Spark-Executor-Speicher ist erforderlich, um Ihre Spark-Tasks gemäß den Anweisungen Ihres Treiberprogramms auszuführen. Grundsätzlich sind mehr Ressourcen erforderlich, die von Ihrem übergebenen Job abhängen.

Der Executor-Speicher umfasst den für die Ausführung der Aufgaben erforderlichen Speicher sowie den Overhead-Speicher, der nicht größer als die Größe der JVM und die maximale Garngröße des Garns sein sollte.

Fügen Sie die folgenden Parameter in der Datei 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 wiederzugeben.

Alternativ können wir den Executor-Kern und den Speicherwert als Argument übergeben, während der spark-submitBefehl 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

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

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

spark-shell --driver-memory "dein Wert" und um den Executor-Speicher einzustellen: spark-shell --executor-memory "dein Wert"

dann denke ich, dass Sie gut sind, um mit dem gewünschten Wert des Speichers zu gehen, den Ihre Funkenhülle verwenden soll.


0
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

Soweit ich weiß, wäre es nicht möglich, die spark.executor.memoryLaufzeit zu ändern . Wenn Sie eine eigenständige Version mit pyspark und graphframes ausführen, können Sie den pyspark starten, REPLindem Sie den folgenden Befehl ausführen:

pyspark --driver-memory 2g --executor-memory 6g --packages graphframes:graphframes:0.7.0-spark2.4-s_2.11

Stellen Sie sicher, dass Sie die SPARK_VERSIONUmgebungsvariable in Bezug auf die neueste veröffentlichte Version von Spark entsprechend ändern

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.