Como resolvo o erro “Sem espaço no dispositivo” em um trabalho de ETL do AWS Glue?

6 minuto de leitura
0

Desejo evitar o erro “Sem espaço no dispositivo” ao executar um trabalho de ETL do AWS Glue.

Breve descrição

Você pode receber os seguintes tipos de erros ao executar uma tarefa de extração, transformação e carregamento (ETL) do AWS Glue:

  • Trabalho anulado devido a uma falha de estágio: A tarefa 68 no estágio 158.0 falhou 4 vezes, falha mais recente: Tarefa 68.3 perdida no estágio 158.0 (TID 28820, 10.102.100.111, executor 17): org.apache.spark.memory.SparkOutOfMemoryError: erro ao chamar spill() em org.apache.spark.shuffle.sort.ShuffleExternalSorter@55f6dabb: Não há mais espaço no dispositivo

        -ou-

  • Trabalho anulado devido a uma falha de estágio: ResultStage 7 falhou o número máximo permitido de vezes: 4. Motivo da falha mais recente: org.apache.spark.shuffle.MetadataFetchFailedException: Falta um local de saída para shuffle 2

O Apache Spark usa o disco local nos operadores do AWS Glue para liberar dados da memória que excedem o espaço de pilha definido pelo parâmetro de configuração spark.executor.memory.

Transformações amplas, como groupByKey(), reduceByKey() e join() podem causar embaralhamento. Durante o estágio de classificação ou embaralhamento do trabalho, o Spark grava os dados intermediários em um disco local antes de poder trocar esses dados entre os diferentes operadores. Nesse ponto, você pode receber uma mensagem “Não há mais espaço no dispositivo “ou um erro MetadataFetchFailedException. O Spark gera esse erro quando não há espaço em disco suficiente no executor e não há recuperação.

Resolução

Esses tipos de erros geralmente ocorrem quando o trabalho de processamento observa uma distorção significativa no conjunto de dados. Esta seção lista algumas das anomalias comuns de monitoramento e depuração e as maneiras de resolvê-las.

As métricas de trabalho do AWS Glue e a IU do Apache Spark são ferramentas poderosas para monitorar a distorção de dados nos executores do Apache Spark. Ao monitorar o cronograma de implementação, a ferramenta permite identificar facilmente quaisquer problemas que possam resultar em distorção dos dados. Ela ajuda você a entender detalhadamente o comportamento de cada estágio, tarefa, trabalho e executor.

Desagregar a computação e o armazenamento

Essa abordagem escala o armazenamento para grandes arquivos em vez de gravar os dados no disco local de operadores do AWS Glue.

**Usar armazenamento dedicado sem servidor:**O AWS Glue 2.0 ou versão superior permite que você use o Amazon Simple Storage Service (Amazon S3) para armazenar dados de embaralhamento e vazamento do Spark.

AWS Glue 2.0 Use os seguintes parâmetros de trabalho para usar o embaralhamento do Amazon S3 no AWS Glue. Para obter mais informações, consulte Plug-in de embaralhamento do AWS Glue Spark shuffle com o Amazon S3.

  • Chave: --write-shuffle-files-to-s3
    Valor: TRUE
  • Chave: --write-shuffle-spills-to-s3
    Valor: TRUE
  • Chave: --conf
    Valor: spark.shuffle.glue.s3ShuffleBucket=s3://custom_shuffle_bucket
    Observação: o sinalizador opcional spark.shuffle.glue.s3ShuffleBucket especifica o bucket do Amazon S3 no qual você grava os arquivos embaralhados. Substitua custom_shuffle_bucket pelo nome do seu bucket do S3.

AWS Glue 3.0/4.0 Use os seguintes parâmetros de trabalho para usar o plug-in de armazenamento embaralhado na nuvem para o Apache Spark. Para mais informações, consulte Plug-in de armazenamento embaralhado na nuvem para Apache Spark.

  • Chave: --write-shuffle-files-to-s3
    Valor: TRUE
  • Chave: --conf
    Valor: spark.shuffle.storage.path=s3://custom_shuffle_bucket
    Observação: o sinalizador opcional spark.shuffle.storage.path especifica o bucket do Amazon S3 no qual você grava os arquivos embaralhados. Substitua custom_shuffle_bucket pelo nome do seu bucket do S3.

Aumento horizontal da escala

O aumento horizontal da escala se refere ao aumento do número de operadores por meio do ajuste de escala horizontal ou à atualização do tipo de operador por meio do ajuste de escala vertical. No entanto, o aumento horizontal da escala nem sempre funciona, especialmente quando seus dados estão muito distorcidos em algumas chaves. Para lidar com a distorção de dados, considere modificar a lógica da aplicação Apache Spark implementando a técnica de aplicação de salt.

Reduzir e filtrar dados de entrada

Pré-filtre os dados de entrada o máximo possível para minimizar a confusão de dados e o uso da rede durante operações abrangentes. Use as seguintes técnicas para uma filtragem de dados eficaz:

Transmitir tabelas pequenas

A união de tabelas no Apache Spark pode acionar o embaralhamento de dados e a movimentação de grandes quantidades de dados entre os executores de diferentes operadores. Isso pode fazer com que o sistema fique sem memória e libere os dados no disco do operador. Para minimizar a sobrecarga da rede, o Spark oferece suporte ao uso de tabelas menores para transmissão. Essas tabelas não são maiores do que dezenas de MBs (megabytes) e evitam o particionamento e o embaralhamento dos dados. Use uma tabela menor para transmissão fornecendo uma dica ao Spark. Para mais informações, consulte Transmitir tabelas pequenas, no blog da AWS Otimizar o gerenciamento de memória no AWS Glue.

Usar o AQE

O Adaptive Query Execution (AQE) do Databricks é uma técnica de otimização no Spark SQL. Ele usa estatísticas de runtime para escolher o plano de implementação de consultas mais eficiente a fim de resolver a distorção dos dados e as partições aleatórias dinâmicas em cada estágio. O AQE está disponível por padrão no AWS Glue 3.0/4.0.

O AQE executa as seguintes funções:

  • Aglutina partições aleatórias dinamicamente
    Aglutina partições automaticamente, se necessário, após cada estágio de consulta e resolve problemas de gerenciamento de partições. Para obter mais informações, consulte Aglutinação dinâmica de partições aleatórias no Adaptive Query Execution: Acelerar o Spark SQL no runtime, no site do Databricks.
    –Poucas partições: Divide automaticamente partições com excesso de dados que causam um vazamento no disco local.
    –Muitas partições: Combina partições automaticamente, conforme necessário. As partições são combinadas quando o tamanho dos dados de cada partição é pequeno e requer pequenas buscas de dados na rede para ler os blocos embaralhados.

  • Alterna dinamicamente as estratégias de junção
    Converte Sort-Merge em Broadcast Hash Join, com base nas estatísticas de tamanho da tabela em cada estágio.

  • Otimiza dinamicamente as junções distorcidas
    Detecta e otimiza automaticamente a junção distorcida a partir de estatísticas de arquivos embaralhados. O AQE divide as partições distorcidas em subpartições menores. Em seguida, ele une essas partições menores à partição correspondente no outro nó. Para obter mais informações, consulte Otimizar dinamicamente junções distorcidas em Adaptive Query Execution: Acelerar o Spark SQL no runtime, no site do Databricks.

Configurar o AQE

Use os seguintes parâmetros de trabalho para ativar o AQE:

  • Chave: --conf
    Valor: spark.sql.adaptive.enabled=true --conf spark.sql.adaptive.coalescePartitions.enabled=true --conf spark.sql.adaptive.skewJoin.enabled=true
AWS OFICIAL
AWS OFICIALAtualizada há um ano