Cómo configurar la memoria de Apache Spark Executor


127

¿Cómo puedo aumentar la memoria disponible para los nodos del ejecutor de chispa Apache?

Tengo un archivo de 2 GB que es adecuado para cargar en Apache Spark. Estoy ejecutando apache spark por el momento en 1 máquina, por lo que el controlador y el ejecutor están en la misma máquina. La máquina tiene 8 GB de memoria.

Cuando intento contar las líneas del archivo después de configurar el archivo para que se almacene en la memoria caché, obtengo estos errores:

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.

Miré a la documentación aquí y puse spark.executor.memorya 4gen$SPARK_HOME/conf/spark-defaults.conf

La interfaz de usuario muestra que esta variable se establece en el entorno de Spark. Puedes encontrar la captura de pantalla aquí

Sin embargo, cuando voy a la pestaña Ejecutor, el límite de memoria para mi Ejecutor único todavía está establecido en 265.4 MB. También sigo teniendo el mismo error.

Intenté varias cosas mencionadas aquí, pero aún recibo el error y no tengo una idea clara de dónde debo cambiar la configuración.

Estoy ejecutando mi código de forma interactiva desde el shell de chispa

Respuestas:


185

Como está ejecutando Spark en modo local, la configuración spark.executor.memoryno tendrá ningún efecto, como ha notado. La razón de esto es que el Trabajador "vive" dentro del proceso JVM del controlador que usted inicia cuando inicia spark-shell y la memoria predeterminada utilizada para eso es 512M . Puede aumentar eso configurando spark.driver.memoryalgo más alto, por ejemplo 5g . Puede hacer eso ya sea:

  • configurándolo en el archivo de propiedades (el valor predeterminado es $SPARK_HOME/conf/spark-defaults.conf),

    spark.driver.memory              5g
    
  • o al proporcionar la configuración en tiempo de ejecución

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

Tenga en cuenta que esto no se puede lograr configurándolo en la aplicación, ya que para entonces ya es demasiado tarde, el proceso ya comenzó con cierta cantidad de memoria.

La razón de 265.4 MB es que Spark dedica spark.storage.memoryFraction * spark.storage.safetyFraction a la cantidad total de memoria de almacenamiento y, de forma predeterminada, son 0.6 y 0.9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Tenga en cuenta que no toda la memoria del controlador estará disponible para el almacenamiento RDD.

Pero cuando comience a ejecutar esto en un clúster, la spark.executor.memoryconfiguración se hará cargo al calcular la cantidad que se dedicará a la memoria caché de Spark.


1
¿5g es equivalente a 5Gb?
Chuck

@Chuck spark.apache.org/docs/latest/… "Cantidad de memoria a utilizar para el proceso del controlador, es decir, donde se inicializa SparkContext, en el mismo formato que las cadenas de memoria JVM con un sufijo de unidad de tamaño (" k "," m "," g "o" t ") (por ejemplo, 512m, 2g)".
James Moore

39

También tenga en cuenta que para el modo local debe establecer la cantidad de memoria del controlador antes de iniciar jvm:

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

Esto iniciará la JVM con 2G en lugar de los 512M predeterminados.
Detalles aquí :

Para el modo local, solo tiene un ejecutor, y este ejecutor es su controlador, por lo que debe configurar la memoria del controlador. * Dicho esto, en modo local, cuando ejecutas spark-submit, ya se ha lanzado una JVM con la configuración de memoria predeterminada, por lo que configurar "spark.driver.memory" en tu conf no hará nada por ti. En su lugar, debe ejecutar spark-submit de la siguiente manera


5

Aparentemente, la pregunta nunca dice que se ejecute en modo local, no en hilo. De alguna manera no pude obtener el cambio spark-default.conf para trabajar. En cambio probé esto y funcionó para mí

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

(no se pudo aumentar la memoria del ejecutor a 8 g hay alguna restricción de la configuración del hilo).


El OP menciona que está usando una sola máquina.
Sharique Abdullah

¿Haces el executor-memorymás alto que driver-memory?
nimeresam

5

La respuesta presentada por Grega me ayudó a resolver mi problema. Estoy ejecutando Spark localmente desde un script de Python dentro de un contenedor Docker. Inicialmente recibía un error de falta de memoria de Java al procesar algunos datos en Spark. Sin embargo, pude asignar más memoria al agregar la siguiente línea a mi script:

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

Aquí hay un ejemplo completo del script de Python que utilizo para iniciar Spark:

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

Necesita aumentar la memoria del controlador. En mac (es decir, cuando se ejecuta en el maestro local), la memoria del controlador predeterminada es 1024M). Por defecto, 380Mb se asignan al ejecutor.

Captura de pantalla

Al aumentar [ --driver-memory 2G ], la memoria del ejecutor aumentó a ~ 950Mb. ingrese la descripción de la imagen aquí


2

cree un archivo llamado spark-env.sh en el directorio spark / conf y agregue esta línea

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

1
Exactamente, ejecuto el maestro con una configuración concreta, no necesitaría agregar opciones cada vez que ejecuto un comando spark. Pero esto es solo para el nodo del clúster, en caso de que sea independiente, la configuración es SPARK_WORKER_MEMORY.
Evhz

1

Puedes construir el comando usando el siguiente ejemplo

 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

La memoria del ejecutor de chispa es necesaria para ejecutar sus tareas de chispa según las instrucciones dadas por su programa de controlador. Básicamente, requiere más recursos que dependen de su trabajo enviado.

La memoria del ejecutor incluye la memoria requerida para ejecutar las tareas más la memoria de gastos generales que no debe ser mayor que el tamaño de JVM y el tamaño máximo del contenedor de hilo.

Agregue los siguientes parámetros en spark-defaults.conf

spar.executor.cores=1

spark.executor.memory=2g

Si utiliza alguna herramienta de administración de clúster, como cloudera manager o amabari , actualice la configuración del clúster para reflejar las últimas configuraciones en todos los nodos del clúster.

Alternativamente, podemos pasar el núcleo del ejecutor y el valor de la memoria como argumento mientras ejecutamos el spark-submitcomando junto con la ruta de clase y aplicación.

Ejemplo:

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

mencionó que está ejecutando su código de manera interactiva en spark-shell, de modo que si no se establece un valor adecuado para la memoria del controlador o la memoria del ejecutor, spark le asigna un valor predeterminado, que se basa en su archivo de propiedades (donde el valor predeterminado es siendo mencionado).

Espero que sea consciente del hecho de que hay un controlador (nodo maestro) y un nodo trabajador (donde los ejecutores se crean y procesan), por lo que básicamente se requieren dos tipos de espacio para el programa spark, por lo que si desea establecer memoria del controlador, entonces cuando se inicia spark-shell.

spark-shell --driver-memory "su valor" y para configurar la memoria del ejecutor: spark-shell --executor-memory "su valor"

entonces creo que es bueno ir con el valor deseado de la memoria que desea que use su spark-shell.


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

Hasta donde sé, no sería posible cambiar el spark.executor.memorytiempo de ejecución. Si está ejecutando una versión independiente, con pyspark y graphframes, puede iniciar el pyspark REPLejecutando el siguiente comando:

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

Asegúrese de cambiar la SPARK_VERSIONvariable de entorno adecuadamente con respecto a la última versión lanzada de Spark

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.