Como resolvo o erro “java.lang.OutOfMemoryError: Java heap space" em uma tarefa do AWS Glue Spark?

5 minuto de leitura
0

Minha tarefa do AWS Glue apresenta o código de falha “Command failed with exit code 1”. O Amazon CloudWatch Logs mostra o erro “java.lang.OutOfMemoryError: Java heap space”.

Breve descrição

O erro “java.lang.OutOfMemory”: O erro “Java heap space” indica que um driver ou executor está ficando sem memória da JVM. Para determinar se um driver ou um executor causa o OOM, consulte Depurar exceções de OOM e anormalidades na tarefa.

Observação: A resolução a seguir é apenas para exceções de OOM do driver.

As exceções do OOM do driver são causadas pelo seguinte:

  • A tarefa do Spark no AWS Glue lê um grande número de arquivos pequenos do Amazon Simple Storage Service (Amazon S3)
  • Operações intensivas do driver, como collect(), junções de transmissão e variável compartilhada

Resolução

Resolva as exceções de OOM do driver causadas por um grande número de arquivos pequenos

Para resolver as exceções de OOM do driver causadas por um grande número de arquivos pequenos com DynamicFrames, use um ou mais dos métodos a seguir.

Ativar a implementação da lista Uses3

Ao listar arquivos, o AWS Glue cria um índice de arquivos nas listas de memória do driver. Quando você define uses3ListImplementation como True, o AWS Glue não armazena em cache a lista de arquivos na memória de uma só vez. Em vez disso, o AWS Glue armazena em cache a lista em lotes. Isso significa que é menos provável que o driver fique sem memória.

Veja o exemplo a seguir de como ativar o useS3ListImplementation com from_catalog:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")

Veja o exemplo a seguir que ativa useS3ListImplementation com from_options:

datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")

O recurso useS3ListImplementation é uma implementação da operação ListKeys do Amazon S3. Isso divide grandes conjuntos de resultados em várias respostas. É uma prática recomendada usar useS3ListImplementation com marcadores de tarefas.

Agrupamento

Um aplicativo do Spark processa cada arquivo pequeno usando uma tarefa diferente do Spark. Isso pode levar ao OOM porque o driver armazena e acompanha a localização e as informações da tarefa. Quando você ativa o recurso de agrupamento, as tarefas processam um grupo de vários arquivos em vez de arquivos individuais. O agrupamento é ativado automaticamente quando você usa quadros dinâmicos e quando o conjunto de dados do Amazon S3 tem mais de 50.000 arquivos. Para obter mais informações, consulte Ler arquivos de entrada em grupos maiores.

Filtragem com predicados push down

Reduza o número de arquivos do Amazon S3 e partições do Amazon S3 que a tarefa do AWS Glue lê usando predicados push down. Isso remove as partições desnecessárias da tabela do AWS Glue antes que os dados subjacentes sejam lidos. Para obter mais informações, consulte Pré-filtragem usando predicados de push down.

Exceções de OOM do driver causadas por operações pesadas do driver

Resolva as exceções de OOM do driver causadas por operações pesadas do driver usando um dos métodos a seguir.

Esteja atento às operações intensivas do driver

collect() é uma operação do Spark que coleta os resultados dos trabalhadores e os retorna ao driver como um único objeto. Os resultados podem ser muito grandes e isso sobrecarrega o driver. Por padrão, a configuração do Spark spark.driver.maxResultSize é definida como 1 GB e ajuda a proteger o driver contra sobrecarga.

Portanto, limite essas ações e, em vez disso, use ações como take(), takeSample() ou isEmpty() sempre que possível.

Além disso, esteja ciente de que as junções de transmissão no Spark podem causar erros de OOM se a relação (tabela) for maior que a memória disponível do driver. Antes de uma relação ser transmitida aos executores, ela se materializa no nó do driver. Se várias tabelas estiverem sendo transmitidas ou a relação for muito grande, o driver poderá ficar sem memória. Use a configuração do Spark spark.sql.autoBroadcastJoinThreshold e Spark Join Hints para controlar isso.

Destrua regularmente variáveis compartilhadas

Certifique-se de usar variáveis compartilhadas com cuidado. Destrua variáveis compartilhadas quando não precisar mais delas, pois elas podem causar exceções de OOM do driver Spark. Existem dois tipos de variáveis compartilhadas, variáveis de transmissão e acumuladores.

  • As variáveis de transmissão são dados somente para leitura que são enviados aos executores somente uma vez. Eles são uma boa solução para armazenar dados de referência imutáveis, como pequenos dicionários ou pequenas tabelas compartilhadas entre todos os executores.
  • Os acumuladores fornecem uma cópia gravável entre os executores do Spark e podem ser usados para implementar contadores distribuídos (como no MapReduce) ou somas.

Solução de problemas adicionais

Informações relacionadas

Otimizar o gerenciamento de memória no AWS Glue

Ler arquivos de entrada em grupos maiores

Melhores práticas para gerenciar com sucesso a memória para aplicativos Apache Spark no Amazon EMR

Monitoramento de tarefas usando a interface web do Apache Spark

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos