Por que meu trabalho do Spark ou Hive no Amazon EMR falha com uma AmazonS3Exception HTTP 503 “Desacelerar”?

5 minuto de leitura
0

Meu trabalho do Apache Spark ou do Apache Hive no Amazon EMR falha com uma AmazonS3Exception HTTP 503 “Desacelerar” semelhante à seguinte: java.io.ioException: java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Desacelerar (serviço: Amazon S3; Código de status: 503; Código de erro: 503 Desacelerar; ID da solicitação: 2E8B8866BFF00645; ID da solicitação estendida do S3: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=

Descrição breve

Esse erro ocorre quando a taxa de solicitação do Amazon Simple Storage Service (Amazon S3) para sua aplicação excede as taxas normalmente sustentadas de mais de 5.000 solicitações por segundo, e o Amazon S3 otimiza internamente a performance.

Para melhorar a taxa de sucesso das suas solicitações ao acessar os dados do S3 usando o Amazon EMR, tente as seguintes abordagens:

  • Modificar a estratégia de repetição para solicitações do S3.
  • Ajuste o número de solicitações simultâneas do S3.

Resolução

Para ajudar a identificar o problema com muitas solicitações, é uma prática recomendada configurar as métricas de solicitação do Amazon CloudWatch para o bucket do S3. Você pode determinar a solução que melhor funciona para seu caso de uso com base nessas métricas do CloudWatch.

Configurar métricas de solicitações do CloudWatch

Para monitorar as solicitações do Amazon S3, ative métricas de solicitações do CloudWatch para o bucket. Em seguida, defina um filtro para o prefixo. Para obter uma lista de métricas úteis para monitorar, consulte Monitorar métricas com o Amazon CloudWatch.

Modificar a estratégia de repetição para solicitações do S3

Por padrão, o EMRFS usa uma estratégia de recuo exponencial para tentar novamente as solicitações ao Amazon S3. O limite padrão de repetição do EMRFS é 15. No entanto, você pode aumentar o limite de novas tentativas em um novo cluster, em um cluster em execução ou no runtime da aplicação.

Para aumentar o limite de novas tentativas, altere o valor do parâmetro fs.s3.maxRetries. Se você definir um valor muito alto para esse parâmetro, poderá ter uma duração de trabalho mais longa. Tente definir esse parâmetro como um valor alto (por exemplo, 20), monitore a sobrecarga de duração dos trabalhos e ajuste esse parâmetro com base no seu caso de uso.

Para um novo cluster, você pode adicionar um objeto de configuração semelhante ao seguinte ao iniciar o cluster:

[
  {
    "Classification": "emrfs-site",
    "Properties": {
      "fs.s3.maxRetries": "20"
    }
  }
]

Depois que o cluster for lançado, as aplicações Spark e Hive executadas no Amazon EMR usarão o novo limite.

Para aumentar o limite de novas tentativas em um cluster em execução, faça o seguinte:

1.    Abra o console do Amazon EMR.

2.    Na lista de clusters, escolha o cluster ativo que você deseja reconfigurar em Nome.

3.    Abra a página de detalhes do cluster e escolha a guia Configurações.

4.    Na lista suspensa Filtro, selecione o grupo de instâncias que você deseja reconfigurar.

5.    Na lista suspensa Reconfigurar, escolha Editar na tabela.

6.    Na tabela de classificação da configuração, escolha Adicionar configuração e insira o seguinte:

Em Classificação: emrfs-site

Em Propriedade: fs.s3.maxRetries

Em Valor: o novo valor para o limite de novas tentativas (por exemplo, 20)

7.    Selecione Aplicar essa configuração a todos os grupos de instâncias ativas.

8.    Escolha Salvar alterações.

Depois que a configuração for implantada, as aplicações Spark e Hive usarão o novo limite.

Para aumentar o limite de novas tentativas em tempo de execução, use uma sessão de shell do Spark semelhante à seguinte:

spark> sc.hadoopConfiguration.set("fs.s3.maxRetries", "20")
spark> val source_df = spark.read.csv("s3://awsexamplebucket/data/")
spark> source_df.write.save("s3://awsexamplebucket2/output/")

Aqui está um exemplo de como aumentar o limite de novas tentativas em tempo de execução para uma aplicação Hive:

hive> set fs.s3.maxRetries=20;
hive> select ....

Ajustar o número de solicitações simultâneas do S3

  • Se você tiver vários trabalhos (Spark, Apache Hive ou s-dist-cp) lendo e gravando com o mesmo prefixo do S3, poderá ajustar a simultaneidade. Comece com os trabalhos mais pesados de leitura/gravação e reduza sua simultaneidade para evitar paralelismo excessivo. Se você configurou o acesso entre contas para o Amazon S3, lembre-se de que outras contas também podem estar enviando trabalhos com o mesmo prefixo.
  • Se você observar erros ao tentar gravar no bucket de destino, reduza o paralelismo excessivo de gravação. Por exemplo, use as operações Spark .coalesce() ou .repartition() para reduzir o número de partições de saída do Spark antes de gravar no Amazon S3. Você também pode reduzir o número de núcleos por executor ou reduzir o número de executores.
  • Se você observar erros ao tentar ler a partir do bucket de origem, ajuste o tamanho dos objetos. Você pode agregar objetos menores a objetos maiores para reduzir o número de objetos a serem lidos pelo trabalho. Isso faz com que seus trabalhos leiam conjuntos de dados com menos solicitações de leitura. Por exemplo, use s3-dist-cp para mesclar um grande número de arquivos pequenos em um número menor de arquivos grandes.

Informações relacionadas

Padrões de projeto com práticas recomendadas: otimização da performance do Amazon S3

Por que minha aplicação do Amazon EMR falha com uma AmazonS3Exception HTTP 403 “Acesso negado”?

Por que minha aplicação do Amazon EMR apresenta uma falha com uma AmazonS3Exception HTTP 404 “Não encontrado”?

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos