Por que meu trabalho no Spark no Amazon EMR falhou?

9 minuto de leitura
0

Meu trabalho no Apache Spark no Amazon EMR falhou.

Resolução

Falhas no aplicativo

ERROR ShuffleBlockFetcherIterator: Failed to get block(s) from ip-192-168-14-250.us-east-2.compute.internal:7337 (Falha ao obter blocos de ip-192-168-14-250.us-east-2.compute.internal:7337)

org.apache.spark.network.client.ChunkFetchFailureException: Failure while fetching StreamChunkId[streamId=842490577174,chunkIndex=0]: java.lang.RuntimeException: Executor is not registered (appId=application_1622819239076_0367, execId=661) (Falha ao buscar StreamChunkid [streamID=842490577174, chunkIndex=0]: java.lang.RuntimeException: O executor não está registrado (appId=application_1622819239076_0367, execid=661))

Esse problema pode ocorrer quando o nó de processamento executor no Amazon EMR está em um estado insalubre. Quando a utilização do disco de um nó de processamento excede o limite de 90% de utilização, o serviço de integridade do YARN NodeManager relata que o nó está UNHEALTHY (não íntegro). Os nós não íntegros estão incluídos nas listas de rejeição do Amazon EMR. Além disso, os contêineres do YARN não são alocados para esses nós.

Para solucionar esse problema, faça o seguinte:

ERROR [Executor task launch worker for task 631836] o.a.s.e.Executor:Exception in task 24.0 in stage 13028.0 (TID 631836) java.util.NoSuchElementException: None.get ([Executor de inicialização de tarefas para a tarefa 631836] o.A.S.E.Executor:exceção na tarefa 24.0 no estágio 13028.0 (TID 631836) java.util.NoSuchElementException: None.get)

Esse erro ocorre quando há um problema no código da aplicação e na inicialização do SparkContext.

Certifique-se de que não haja vários trabalhos do SparkContext ativos na mesma sessão. De acordo com a Java Virtual Machine (JVM), é possível ter um SparkContext ativo por vez. Se quiser inicializar outro SparkContext, interrompa o trabalho ativo antes de criar um novo.

Container killed on request. Exit code is 137 (Contêiner encerrado a pedido. O código de saída é 137)

Essa exceção ocorre quando uma tarefa em um contêiner YARN excede a memória física alocada para esse contêiner. Isso geralmente acontece quando há partições aleatórias, tamanhos de partição inconsistentes ou um grande número de núcleos executores.

Examine os detalhes do erro nos logs do driver do Spark para determinar a causa do erro. Para mais informações, consulte Como posso acessar os logs de driver do Spark em um cluster do Amazon EMR?

Veja a seguir um exemplo de erro do log do driver:

ERROR YarnScheduler: Lost executor 19 on ip-10-109-xx-xxx.aws.com : Container from a bad node: container_1658329343444_0018_01_000020 on host: ip-10-109-xx-xxx.aws.com . Exit status: 137.Diagnostics:
Container killed on request. Exit code is 137
Container exited with a non-zero exit code 137.
Killed by external signal
Executor container 'container_1658329343444_0018_01_000020' was killed with exit code 137. To understand the root cause, you can analyze executor container log.
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 23573"...

O monitoramento da pilha de erros anterior indica que não há memória disponível suficiente no executor para continuar processando dados. Esse erro pode ocorrer em diferentes estágios do trabalho, tanto em transformações estreitas quanto amplas.

Para resolver o problema, siga um destes procedimentos:

  • Aumente a memória do executor.
    Observação: a memória do executor inclui a memória necessária para executar as tarefas, além da memória suspensa. A soma não deve ser maior do que o tamanho do JVM e o tamanho máximo do contêiner do YARN.
  • Adicione mais partições do Spark.
  • Aumente o número de partições aleatórias.
  • Reduza o número de núcleos de executores.

Para obter mais informações, consulte Como resolvo “Container killed on request. Exit code is 137" do Spark no Amazon EMR?

Os trabalhos do Spark estão suspensos e não estão sendo concluídos

Os trabalhos do Spark podem estar paralisados por vários motivos. Por exemplo, se o processo do driver do Spark (mestre da aplicação) for afetado ou os contêineres do executor forem perdidos.

Isso geralmente acontece quando há alta utilização do espaço em disco ou uso de Instâncias Spot para nós de cluster e a Instância Spot é encerrada. Para obter mais informações, consulte Como posso resolver erros ExecutorLostFailure de "perda de escravo" do Spark no Amazon EMR?

Para solucionar esse problema, faça o seguinte:

  • Examine os logs mestres ou de drivers da aplicação do Spark para ver se há exceções.
  • Valide a lista de nós do YARN para quaisquer nós não íntegros. Quando a utilização do disco de um nó central excede o limite de utilização, o serviço de integridade do YARN Node Manager relata o nó como UNHEALTHY (não íntegro). Os nós não íntegros estão incluídos nas listas de rejeição do Amazon EMR. Além disso, os contêineres do YARN não são alocados para esses nós.
  • Monitore a utilização do espaço em disco e configure os volumes do Amazon Elastic Block Store (Amazon EBS) para manter a utilização abaixo de 90% nos nós de processamento do cluster do EMR.

WARN Executor: Issue communicating with driver in heartbeater org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [10000 milliseconds]. (AVISO Executor: Problema na comunicação com o driver no heartbeater org.apache.spark.rpc.RpcTimeoutException: os futuros expiraram após [10000 milissegundos]). Esse tempo limite é controlado por spark.executor.heartbeatInterval

Os executores do Spark enviam sinais de pulsação para o driver do Spark em intervalos especificados pela propriedade spark.executor.heartbeatInterval. Durante longas pausas na coleta de resíduos, o executor pode não enviar um sinal de pulsação. O driver encerra executores que não enviam um sinal de pulsação maior do que o valor especificado.

TimeoutException (Exceção de tempo limite)

As exceções de tempo limite ocorrem quando o executor está sob restrição de memória ou enfrenta problemas de OOM durante o processamento de dados. Isso também afeta o processo de coleta de resíduos, causando mais atrasos.

Use um dos métodos a seguir para resolver erros de tempo limite de pulsação:

  • Aumente a memória do executor. Além disso, dependendo do processo da aplicação, reparticione seus dados.
  • Ajuste a coleta de resíduos.
  • Aumente o intervalo para spark.executor.heartbeatInterval.
  • Especifique um período de tempo limite para spark.network.timeout mais longo.

ExecutorLostFailure "Exit status: -100. Diagnostics: Container released on a *lost* node (Status de saída: -100 Diagnóstico: contêiner liberado em um nó *pedido*)

Esse erro ocorre quando um núcleo ou nó de tarefa é encerrado devido à alta utilização do espaço em disco. O erro também ocorre quando um nó deixa de responder devido à alta utilização prolongada da CPU ou à baixa memória disponível. Para obter as etapas de solução de problemas, consulte Como posso resolver “Exit status: -100. Diagnostics: Container released on a *lost* node” no Amazon EMR?

Observação: esse erro também pode ocorrer quando você usa instâncias Spot para nós de cluster e uma instância Spot é encerrada. Nesse cenário, o cluster do EMR provisiona uma instância sob demanda para substituir a instância Spot encerrada. Isso significa que a aplicação pode se recuperar sozinha. Para obter mais informações, consulte Aprimoramentos do Spark para elasticidade e resiliência no Amazon EMR.

executor 38: java.sql.SQLException (Network error IOException: Connection timed out (Connection timed out) (executor 38: jaa.sql.SQLException (Erro de rede IOException: tempo limite de conexão esgotado (Tempo limite de conexão esgotado))

Esse problema está relacionado à comunicação com o banco de dados SQL para estabelecer a conexão do soquete ao ler ou gravar dados. Verifique se o host do banco de dados pode receber conexões de entrada na porta 1433 dos grupos de segurança do cluster do EMR.

Além disso, analise o número máximo de conexões paralelas de banco de dados configuradas para o banco de dados SQL e a alocação de memória para a classe da instância do banco de dados. As conexões de banco de dados também consomem memória. Se a utilização for alta, revise a configuração do banco de dados e o número de conexões permitidas. Para obter mais informações, consulte Número máximo de conexões de banco de dados.

Exceções do Amazon S3

HTTP 503 “Slow Down” (Desacelerar)

As exceções HTTP 503 ocorrem quando você excede a taxa de solicitação do Amazon Simple Storage Service (Amazon S3) para o prefixo. Uma exceção 503 nem sempre significa que uma falha ocorrerá. No entanto, mitigar o problema pode melhorar o desempenho da aplicação.

Para obter mais informações, consulte Por que meu trabalho do Spark ou Hive no Amazon EMR falha com um erro HTTP 503 “Slow Down” AmazonS3Exception?

HTTP 403 “Access Denied” (Acesso negado)

Os erros HTTP 403 são causados por credenciais incorretas ou inválidas, como:

  • Credenciais ou funções que estão especificadas no código da sua aplicação.
  • A política anexada à função de perfil de instância do Amazon EC2.
  • Endpoints da Amazon Virtual Private Cloud (Amazon VPC) para Amazon S3.
  • As políticas de buckets de origem e de destino do S3.

Para resolver erros 403, certifique-se de que a função ou política relevante do AWS Identity and Access Management (IAM) permita o acesso ao Amazon S3. Para obter mais informações, consulte Por que minha aplicação do Amazon EMR falha com um erro HTTP 403 “Access Denied” AmazonS3Exception?

HTTP 404 “Not Found” (Não encontrado)

Erros HTTP 404 indicam que a aplicação esperava encontrar um objeto no S3, mas, no momento da solicitação, o objeto não foi encontrado. As causas comuns incluem:

  • Caminhos do S3 incorretos (por exemplo, um caminho digitado incorretamente).
  • O arquivo foi movido ou excluído por um processo fora da aplicação.
  • Uma operação que causou eventuais problemas de consistência, como uma substituição.

Para obter mais informações, consulte Por que minha aplicação do Amazon EMR apresenta um erro HTTP 404 “Not Found” AmazonS3Exception?


AWS OFICIAL
AWS OFICIALAtualizada há um ano