Por que minha tarefa de ETL no AWS Glue falha com o erro “Contêiner eliminado pelo YARN por exceder os limites de memória”?

4 minuto de leitura
0

Meu trabalho de extração, transformação e carregamento (ETL) do AWS Glue falha com o erro “Contêiner eliminado pelo YARN por exceder os limites de memória”.

Descrição breve

As causas mais comuns desse erro são as seguintes:

  • Operações que consomem muita memória, como unir tabelas grandes ou processar conjuntos de dados com uma distorção na distribuição de valores de colunas específicos, excedendo o limite de memória do cluster subjacente do Spark
  • Partições grandes de dados que consomem mais que a memória atribuída ao respectivo executor
  • Arquivos grandes que não podem ser divididos, resultando em grandes partições na memória

Resolução

Use uma ou mais das seguintes opções de solução para resolver esse erro:

  • Atualize o tipo de trabalhador de G.1x para G.2x que tenha configurações de memória mais altas. Para mais informações sobre as especificações de tipos de trabalhadores, consulte a seção Tipo de trabalhador em Definir propriedades de trabalho para trabalhos do Spark.
  • Para saber mais sobre a migração do AWS Glue 2.0 para 3.0, consulte Migrar do AWS Glue 2.0 para o AWS Glue 3.0.
  • Você também pode revisar a tabela a seguir para obter informações sobre as especificações do tipo de trabalhador:
AWS Glue versões 1.0 e 2.0
Padrãospark.executor.memory: 5g spark.driver.memory: 5g spark.executor.cores: 4
G.1xspark.executor.memory: 10g spark.driver.memory: 10g spark.executor.cores: 8
G.2xspark.executor.memory: 20g spark.driver.memory: 20g spark.executor.cores: 16
AWS Glue versão 3.0
Padrãospark.executor.memory: 5g spark.driver.memory: 5g spark.executor.cores: 4
G.1xspark.executor.memory: 10g spark.driver.memory: 10g spark.executor.cores: 4
G.2xspark.executor.memory: 20g spark.driver.memory: 20g spark.executor.cores: 8
  • Se o erro persistir após o upgrade do tipo de trabalhador, aumente o número de executores do trabalho. Cada executor tem um certo número de núcleos. Esse número determina o número de partições que podem ser processadas pelo executor. As configurações do Spark para as unidades de processamento de dados (DPUs) são definidas com base no tipo de trabalhador.
  • Verifique se que os dados foram devidamente paralelizados para que os executores possam ser usados uniformemente antes de qualquer operação aleatória, como junções. Você pode reparticionar os dados entre todos os executores. Você pode fazer isso incluindo os seguintes comandos para o DynamicFrame do AWS Glue e o DataFrame do Spark na sua tarefa de ETL, respectivamente.
dynamicFrame.repartition(totalNumberOfExecutorCores)

dataframe.repartition(totalNumberOfExecutorCores)
  • O uso de marcadores de tarefas permite que somente os arquivos recém-gravados sejam processados pelo trabalho do AWS Glue. Isso reduz o número de arquivos processados pela tarefa do AWS Glue e alivia problemas de memória. Os marcadores armazenam os metadados sobre os arquivos processados na execução anterior. Na execução subsequente, o trabalho compara o carimbo de data/hora e decide se processará esses arquivos novamente. Para mais informações, consulte Rastrear dados processados usando marcadores de trabalhos.
  • Ao se conectar a uma tabela JDBC, o Spark abre somente uma conexão simultânea por padrão. O driver tenta baixar a tabela inteira de uma vez em um único executor do Spark. Isso pode levar mais tempo e até mesmo causar erros de falta de memória para o executor. Em vez disso, você pode definir propriedades específicas da sua tabela JDBC para instruir o AWS Glue a ler dados em paralelo por meio de DynamicFrame. Para mais informações, consulte Fazer a leitura de tabelas JDBC em paralelo. Ou você pode obter leituras paralelas do JDBC por meio do DataFrame do Spark. Para mais informações, consulte Leituras paralelas de DataFrame do Spark a partir do JDBC e revise propriedades, como partitionColumn, lowerBound, upperBound e numPartitions.
  • Evite usar funções definidas pelo usuário em seu trabalho de ETL, especialmente ao combinar o código Python/Scala com funções e métodos do Spark. Por exemplo, evite usar o df.count() do Spark para verificar DataFrames vazios em instruções if/else ou em loops for. Em vez disso, use uma função com melhor performance, como df.schema() ou df.rdd.isEmpty().
  • Teste a tarefa do AWS Glue em um endpoint de desenvolvimento e otimize o código ETL adequadamente.
  • Se nenhuma das opções de solução anteriores funcionar, divida os dados de entrada em partes ou partições. Em seguida, execute vários trabalhos de ETL do AWS Glue em vez de executar um único trabalho grande. Para mais informações, consulte Particionamento de workloads com execução limitada.

Informações relacionadas

Depuração de exceções OOM e anomalias de trabalho

Práticas recomendadas para escalar trabalhos do Apache Spark e particionar dados com o AWS Glue

Otimizar o gerenciamento de memória no AWS Glue

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos