Como definir a memória do Apache Spark Executor


127

Como posso aumentar a memória disponível para os nós do executor do Apache spark?

Eu tenho um arquivo de 2 GB adequado para carregar no Apache Spark. Atualmente, estou executando o apache spark em uma máquina, para que o driver e o executor estejam na mesma máquina. A máquina possui 8 GB de memória.

Quando tento contar as linhas do arquivo após definir o arquivo a ser armazenado em cache na memória, recebo os seguintes erros:

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.

Eu olhei para a documentação aqui e definir spark.executor.memorya 4gem$SPARK_HOME/conf/spark-defaults.conf

A interface do usuário mostra que essa variável está definida no ambiente Spark. Você pode encontrar a captura de tela aqui

No entanto, quando vou para a guia Executor, o limite de memória para meu único Executor ainda está definido para 265,4 MB. Eu também continuo com o mesmo erro.

Tentei várias coisas mencionadas aqui, mas ainda recebo o erro e não tenho uma ideia clara de onde devo alterar a configuração.

Estou executando meu código interativamente a partir do shell de faísca

Respostas:


185

Como você está executando o Spark no modo local, a configuração spark.executor.memorynão terá nenhum efeito, como você notou. A razão para isso é que o Worker "vive" no processo da JVM do driver iniciado quando você inicia o spark-shell e a memória padrão usada para isso é 512M . Você pode aumentar isso configurando spark.driver.memorypara algo mais alto, por exemplo, 5g . Você pode fazer isso:

  • definindo-o no arquivo de propriedades (o padrão é $SPARK_HOME/conf/spark-defaults.conf),

    spark.driver.memory              5g
    
  • ou fornecendo a configuração em tempo de execução

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

Observe que isso não pode ser alcançado configurando-o no aplicativo, porque já é tarde demais para isso, o processo já foi iniciado com uma certa quantidade de memória.

A razão para 265,4 MB é que o Spark dedica spark.storage.memoryFraction * spark.storage.safetyFraction à quantidade total de memória de armazenamento e, por padrão, são 0,6 e 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Portanto, lembre-se de que nem toda a quantidade de memória do driver estará disponível para armazenamento RDD.

Mas quando você começar a executar isso em um cluster, a spark.executor.memoryconfiguração assumirá o controle ao calcular o valor a ser dedicado ao cache de memória do Spark.


1
5g é equivalente a 5Gb?
Chuck

@Chuck spark.apache.org/docs/latest/… "Quantidade de memória a ser usada no processo do driver, ou seja, onde o SparkContext é inicializado, no mesmo formato das seqüências de memória JVM com um sufixo de unidade de tamanho (" k "," m "," g "ou" t ") (por exemplo, 512m, 2g)."
James Moore

39

Observe também que, no modo local, você deve definir a quantidade de memória do driver antes de iniciar a jvm:

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

Isso iniciará a JVM com 2G em vez dos 512M padrão.
Detalhes aqui :

Para o modo local, você possui apenas um executor, e esse executor é o seu driver; portanto, é necessário definir a memória do driver. * Dito isto, no modo local, no momento em que você executa o envio por spark, uma JVM já foi iniciada com as configurações de memória padrão, portanto, definir "spark.driver.memory" em seu arquivo não fará nada por você. Em vez disso, você precisa executar o envio de spark da seguinte maneira


5

Aparentemente, a pergunta nunca diz para rodar no modo local e não no fio. De alguma forma, não consegui fazer com que a mudança spark-default.conf funcionasse. Em vez disso, tentei isso e funcionou para mim

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

(não foi possível aumentar a memória do executor para 8g, há alguma restrição na configuração do fio).


O OP menciona que ele está usando uma única máquina.
Sharique Abdullah

Você faz o executor-memorymaior que driver-memory?
Neroesam

5

A resposta enviada por Grega me ajudou a resolver meu problema. Estou executando o Spark localmente a partir de um script python dentro de um contêiner do Docker. Inicialmente, eu estava recebendo um erro de falta de memória do Java ao processar alguns dados no Spark. No entanto, consegui atribuir mais memória adicionando a seguinte linha ao meu script:

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

Aqui está um exemplo completo do script python que eu uso para iniciar o 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

Você precisa aumentar a memória do driver. No mac (ou seja, quando executado no mestre local), a memória do driver padrão é 1024M). Por padrão, assim, 380Mb são alocados ao executor.

Captura de tela

Ao aumentar [ --driver-memory 2G ], a memória do executor aumentou para ~ 950Mb. insira a descrição da imagem aqui


2

crie um arquivo chamado spark-env.sh no diretório spark / conf e inclua esta linha

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

1
Exatamente, eu executo o mestre com configuração concreta, não precisaria adicionar opções sempre que executar um comando spark. Mas isso é apenas para o nó do cluster, caso a configuração seja autônoma SPARK_WORKER_MEMORY.
Evhz 23/05

1

Você pode construir o comando usando o seguinte exemplo

 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

A memória do executor do Spark é necessária para executar suas tarefas do spark com base nas instruções fornecidas pelo seu programa de driver. Basicamente, requer mais recursos que dependem do seu trabalho enviado.

A memória do executor inclui a memória necessária para executar as tarefas, além da memória indireta, que não deve ser maior que o tamanho da JVM e do tamanho máximo do contêiner do fio.

Adicione os seguintes parâmetros no spark-defaults.conf

spar.executor.cores=1

spark.executor.memory=2g

Se você estiver usando alguma ferramenta de gerenciamento de cluster, como cloudera manager ou amabari , atualize a configuração do cluster para refletir as configurações mais recentes em todos os nós no cluster.

Como alternativa, podemos passar o núcleo do executor e o valor da memória como argumento enquanto executamos o spark-submitcomando, juntamente com o caminho da classe e do aplicativo.

Exemplo:

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

você mencionou que está executando o seu código de maneira interativa no shell de spark; portanto, ao fazer isso se nenhum valor adequado for definido para a memória do driver ou da memória do executor, o spark atribuirá algum valor a ele, que é baseado no arquivo de propriedades (onde o valor padrão é sendo mencionado).

Espero que você esteja ciente do fato de que existe um driver (nó mestre) e nó de trabalho (onde os executores são criados e processados); portanto, basicamente dois tipos de espaço são necessários pelo programa spark, portanto, se você deseja definir memória do driver, em seguida, quando iniciar spark-shell.

spark-shell --driver-memory "seu valor" e para definir a memória do executor: spark-shell --executor-memory "seu valor"

então eu acho que você é bom em ir com o valor desejado da memória que você deseja que seu spark-shell use.


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

Tanto quanto eu sei, não seria possível alterar o spark.executor.memorytempo de execução. Se você estiver executando uma versão independente, com pyspark e graphframes, poderá iniciar o pyspark REPLexecutando o seguinte comando:

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

Certifique-se de alterar a SPARK_VERSIONvariável de ambiente adequadamente em relação à versão mais recente do Spark

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.