tuning tuneado spark mexico memory apache-spark

memory - tuneado - Cómo configurar la memoria de Apache Spark Executor



spark tuning 2018 (9)

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).

¿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é la documentación here y configuré spark.executor.memory en 4g en $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 here

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 here 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


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

  • configurándolo en el archivo de propiedades (el valor predeterminado es 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 configuración spark.executor.memory se hará cargo al calcular la cantidad que se dedicará a la memoria caché de Spark.


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 el administrador de clouddera 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 spark-submit comando spark-submit 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


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 memoria insuficiente 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)


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.

Al aumentar [ --driver-memory 2G ], la memoria del ejecutor aumentó a ~ 950Mb.


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"


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 here :

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


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


mencionó que está ejecutando su código de forma interactiva en spark-shell, por lo tanto, si lo hace si no se establece un valor adecuado para la memoria del controlador o la memoria del ejecutor, entonces 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 por parte del 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.