Como resolvo o erro “Contêiner eliminado pelo YARN por exceder os limites de memória” do Spark no Amazon EMR?

6 minuto de leitura
0

Quero solucionar o erro “Contêiner eliminado pelo YARN por exceder os limites de memória” no Spark no Amazon EMR.

Descrição breve

Use um dos métodos a seguir para resolver esse erro:

  • Aumente a sobrecarga de memória.
  • Reduza o número de núcleos executores.
  • Aumente o número de partições.
  • Aumente a memória do driver e do executor.

Resolução

A causa raiz e a solução apropriada para esse erro dependem da sua workload. Talvez seja necessário tentar cada um dos métodos a seguir, na ordem especificada, para solucionar o erro. Antes de continuar com o próximo método desta sequência, reverta todas as alterações feitas em spark-defaults.conf na seção anterior.

Aumente a sobrecarga de memória

Sobrecarga de memória é a quantidade de memória externa alocada a cada executor. Por padrão, a sobrecarga de memória está definida como 10% da memória do executor, ou 384, o que for maior. A sobrecarga de memória é usada para buffers diretos Java NIO, pilhas de threads, bibliotecas nativas compartilhadas ou arquivos mapeados em memória.

Considere fazer aumentos graduais na sobrecarga de memória, até 25%. A soma da memória do driver ou do executor mais a sobrecarga de memória deve ser menor que yarn.nodemanager.resource.memory-mb para seu tipo de instância.

spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb

Se o erro ocorrer no contêiner do driver ou no contêiner do executor, considere aumentar a sobrecarga de memória somente para esse contêiner. Você pode aumentar a sobrecarga de memória enquanto o cluster está em execução, ao iniciar um novo cluster ou ao enviar um trabalho.

Em um cluster em execução:

Modifique spark-defaults.conf no nó principal.

Por exemplo:

sudo vim /etc/spark/conf/spark-defaults.conf

spark.driver.memoryOverhead 512
spark.executor.memoryOverhead 512

Em um novo cluster:

Adicione um objeto de configuração semelhante ao seguinte ao iniciar um cluster:

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.driver.memoryOverhead": "512",
      "spark.executor.memoryOverhead": "512"
    }
  }
]

Para um único trabalho:

Use a opção --conf para aumentar a sobrecarga de memória ao executar spark-submit.

Por exemplo:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --conf spark.driver.memoryOverhead=512 --conf spark.executor.memoryOverhead=512 /usr/lib/spark/examples/jars/spark-examples.jar 100

Se aumentar a sobrecarga de memória não resolver o problema, reduza o número de núcleos executores.

Reduzir o número de núcleos executores

Isso reduz o número máximo de tarefas que o executor pode realizar, o que reduz a quantidade de memória necessária. Dependendo do contêiner do driver que está gerando esse erro ou do outro contêiner do executor que está recebendo esse erro, considere diminuir os núcleos do driver ou do executor.

Em um cluster em execução:

Modifique spark-defaults.conf no nó principal.

Por exemplo:

sudo vim /etc/spark/conf/spark-defaults.conf
spark.driver.cores  3
spark.executor.cores  3

Em um novo cluster:

Adicione um objeto de configuração semelhante ao seguinte ao iniciar um cluster:

[
  {
    "Classification": "spark-defaults",
    "Properties": {"spark.driver.cores" : "3",
      "spark.executor.cores": "3"
    }
  }
]

Para um único trabalho:

Use a opção --executor-cores para reduzir o número de núcleos executores ao executar spark-submit.

Por exemplo:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-cores 3 --driver-cores 3 /usr/lib/spark/examples/jars/spark-examples.jar 100

Se você ainda receber a mensagem de erro, aumente o número de partições.

Aumentar o número de partições

Para aumentar o número de partições, aumente o valor de spark.default.parallelism para conjuntos de dados distribuídos resilientes brutos ou execute uma operação .repartition(). Aumentar o número de partições reduz a quantidade de memória necessária por partição. O Spark usa muito a RAM do cluster como uma forma eficaz de maximizar a velocidade. Portanto, você deve monitorar o uso da memória com o Ganglia e, em seguida, verificar se as configurações do cluster e a estratégia de particionamento atendem às suas crescentes necessidades de dados. Se você ainda receber a mensagem de erro “Contêiner eliminado pelo YARN por exceder limites de memória”, aumente a memória do driver e do executor.

Aumentar a memória do driver e do executor

Se o erro ocorrer em um contêiner de driver ou em um contêiner de executor, considere aumentar a memória do driver ou do executor, mas não de ambos. Certifique-se de que a soma da memória do driver ou do executor mais a sobrecarga de memória do driver ou do executor seja sempre menor que o valor de yarn.nodemanager.resource.memory-mb para seu tipo de instância do EC2:

spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb

Em um cluster em execução:

Modifique spark-defaults.conf no nó principal.

Exemplo:

sudo vim /etc/spark/conf/spark-defaults.conf

spark.executor.memory  1g
spark.driver.memory  1g

Em um novo cluster:

Adicione um objeto de configuração semelhante ao seguinte ao iniciar um cluster:

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.executor.memory": "1g",
      "spark.driver.memory":"1g",
    }
  }
]

Para um único trabalho:

Use as opções --executor-memory e --driver-memory para aumentar a memória ao executar spark-submit.

Por exemplo:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-memory 1g --driver-memory 1g /usr/lib/spark/examples/jars/spark-examples.jar 100

Outras opções de solução

Se você ainda receber a mensagem de erro, tente o seguinte:

  • Avaliação comparativa: é uma prática recomendada executar sua aplicação em um conjunto de dados de amostra. Isso pode ajudar a identificar lentidão e partições distorcidas que podem causar problemas de memória.
  • Filtragem de dados: certifique-se de estar processando a quantidade mínima de dados. Se você não filtrar seus dados ou se filtrar no final da execução da aplicação, o excesso de dados poderá tornar a aplicação mais lenta. Isso pode aumentar a chance de uma exceção de memória.
  • Tamanho do conjunto de dados: é uma prática recomendada processar os dados mínimos necessários. Particione seus dados para que somente os dados necessários sejam ingeridos.
  • Estratégia de particionamento: considere usar uma estratégia de particionamento diferente. Por exemplo, particione em uma chave alternativa para evitar partições grandes e distorcidas.
  • Tipo de instância do EC2: é possível que sua instância do EC2 não tenha os recursos de memória necessários para sua workload. Mudar para um tipo de instância maior com otimização de memória pode resolver o erro. Se você ainda tiver exceções de memória depois de alterar os tipos de instância, experimente os métodos de solução de problemas na nova instância.

Informações relacionadas

Configuração do Spark

Como resolvo o erro “java.lang.ClassNotFoundException” do Spark no Amazon EMR?

AWS OFICIAL
AWS OFICIALAtualizada há um ano