Ir para o conteúdo

Por que meu trabalho de ETL do AWS Glue falha com o erro “Container killed by YARN for exceeding memory limits”?

4 minuto de leitura
0

Meu trabalho de extração, transformação e carregamento (ETL) do AWS Glue apresenta falha com o erro “Container killed by YARN for exceeding memory limits”.

Breve descrição

Confira a seguir as causas comuns desse erro:

  • Operações que consomem muita memória que excedem o limite de memória do cluster Apache Spark subjacente. Essas operações podem incluir quando você une tabelas grandes ou processa conjuntos de dados com uma distorção na distribuição.
  • Partições grandes de dados que consomem mais que a memória atribuída ao respectivo executor.
  • Arquivos grandes que não é possível dividir e resultam em grandes partições na memória.

Resolução

Para resolver esse erro, conclua uma ou mais das etapas a seguir:

Faça upgrade do tipo de trabalho

Como o G.2x tem configurações com mais memória, faça upgrade do tipo de processamento. É possível fazer upgrade do tipo de processamento de G.1x para os seguintes tipos de processamento:

  • G.2x
  • G.4x
  • G.8x
  • G.12x
  • G.16x
  • R.1x
  • R.2x
  • R.4x
  • R.8x

Para obter mais informações sobre as especificações dos tipos de processamento, consulte Definir propriedades de trabalho para trabalhos do Spark e Versões do AWS Glue.

Aumente os executores do trabalho

Se o erro persistir após o upgrade do tipo de processamento, aumente o número de executores do trabalho. Para cada executor, há um certo número de núcleos. Esse número determina o número de partições que podem ser processadas pelo executor. O tipo de operador define as configurações do Spark para as unidades de processamento de dados (data processing units, DPUs).

Atualize seus dados

Para garantir que o AWS Glue use os executores uniformemente antes de uma operação aleatória, como uniões, verifique se seus dados estão paralelos. Para repartir dados em todos os executores, inclua um dos seguintes comandos em seu trabalho de ETL.

Em DynamicFrame, inclua o seguinte comando:

dynamicFrame.repartition(totalNumberOfExecutorCores)

Em DataFrame, inclua o seguinte comando:

dataframe.repartition(totalNumberOfExecutorCores)

Use marcadores de trabalho

Quando você usa marcadores de trabalho, o trabalho do AWS Glue processa somente os arquivos recém-gravados. Essa configuração reduz o número de arquivos que o trabalho do AWS Glue processa e reduz os problemas de memória. Os marcadores armazenam os metadados dos arquivos processados da execução anterior. Na execução subsequente, o trabalho compara o carimbo de data/hora e decide se processará esses arquivos novamente. Para obter mais informações, consulte Rastrear dados processados usando marcadores de trabalho.

Use o DynamicFrame para ler dados em paralelo

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. Esse download pode levar mais tempo e causar erros de falta de memória (OOM) para o executor. Em vez disso, é possível definir propriedades específicas da sua tabela JDBC para instruir o AWS Glue a ler dados em paralelo por meio de DynamicFrame. Ou é possível usar o Spark DataFrame para obter leituras paralelas do JDBC. Para obter mais informações, consulte JDBC to other databases (JDBC para outros bancos de dados) no site do Spark.

Use funções de alto desempenho em seu trabalho de ETL

Para seu trabalho de ETL, não use funções definidas pelo usuário, especialmente ao combinar código Python ou Scala com funções e métodos do Spark. Por exemplo, não use df.count() do Spark para verificar DataFrames vazios nas instruções if/else ou nos loops for. Em vez disso, use funções com desempenho melhor, como df.schema() ou df.rdd.isEmpty().

Teste e otimize o trabalho do AWS Glue

Antes de executar o trabalho do AWS Glue na produção, teste o trabalho do AWS Glue em uma sessão interativa e otimize o código ETL.

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 Particionar workloads com execução limitada.

Informações relacionadas

Depurar exceções OOM e anomalias de trabalho

Best practices to scale Apache Spark jobs and partition data with AWS Glue (Práticas recomendadas para escalar trabalhos do Apache Spark e particionar dados com o AWS Glue)

Optimize memory management in AWS Glue (Otimização do gerenciamento de memória no AWS Glue)

AWS OFICIALAtualizada há 5 meses