Meu trabalho do Apache Spark ou do Apache Hive no Amazon EMR falha com AmazonS3Exception “Desacelerar” HTTP 503.
Breve descrição
Quando a taxa de solicitação do Amazon Simple Storage Service (Amazon S3) para sua aplicação excede as taxas normalmente sustentadas e o Amazon S3 otimiza internamente o desempenho, você recebe o seguinte erro:
"java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Slow Down (Service: Amazon S3; Status Code: 503; Error Code: 503 Slow Down; Request ID: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE="
Resolução
Configure as métricas de solicitação do CloudWatch
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 Amazon S3.
Ative as métricas de solicitação do CloudWatch para o bucket e defina um filtro para o prefixo.
Modifique a estratégia de novas tentativas para solicitações do Amazon S3
Por padrão, o Sistema de arquivos do EMR (EMRFS) usa uma estratégia de recuo exponencial para realizar novas tentativas das solicitações ao Amazon S3. O limite padrão de nova tentativa do EMRFS é 15. No entanto, é possível 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.
Observação: se você definir um valor muito alto para esse parâmetro, poderá ter uma duração de trabalho mais longa.
Defina o parâmetro com um valor alto, por exemplo, 20, e monitore a sobrecarga de duração dos trabalhos. Em seguida, ajuste o parâmetro com base no seu caso de uso.
Para um novo cluster, é possível adicionar um objeto de configuração semelhante ao seguinte ao iniciar o cluster:
[
{
"Classification": "emrfs-site",
"Properties": {
"fs.s3.maxRetries": "20"
}
}
]
Depois de iniciar o cluster, as aplicações do Spark e do Hive executadas no Amazon EMR usam o novo limite.
Para aumentar o limite de novas tentativas em um cluster em execução, conclua as seguintes etapas:
- Abra o console do Amazon EMR.
- Escolha o cluster ativo que você deseja reconfigurar.
- Clique na guia Configurações.
- Na lista suspensa Filtro, selecione o grupo de instâncias que você deseja reconfigurar.
- Na lista suspensa Reconfigurar, clique em Editar na tabela.
- Na tabela de classificação da configuração, selecione Adicionar configuração e insira os seguintes valores:
Em Classificação, use emrfs-site
Em Propriedade, use fs.s3.maxRetries
Em Valor, use o novo valor para o limite de novas tentativas. Por exemplo, 20.
- Selecione Aplicar essa configuração a todos os grupos de instâncias ativas.
- Clique em Salvar alterações.
Depois que a configuração for implantada, as aplicações do Spark e do Hive usarão o novo limite.
Para aumentar o limite de novas tentativas em runtime de uma aplicação do Spark, use uma sessão de shell do Spark para modificar o parâmetro fs.s3.maxRetries semelhante ao exemplo a seguir:
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/")
Para aumentar o limite de novas tentativas em runtime para uma aplicação do Hive, execute um comando semelhante ao exemplo a seguir:
hive> set fs.s3.maxRetries=20;
hive> select ....
Ajuste o número de solicitações simultâneas do Amazon S3
- Se você tiver vários trabalhos (Spark, Apache Hive ou s-dist-cp) lendo e gravando para o mesmo prefixo do Amazon S3, será possível ajustar a simultaneidade. Comece com os trabalhos mais pesados de leitura/gravação e reduza sua simultaneidade para evitar paralelismo excessivo.
Observação: se você configurou o acesso entre contas para o Amazon S3, outras contas da AWS também podem enviar trabalhos para o mesmo prefixo.
- Se você observar erros no trabalho ao tentar gravar no bucket de destino, reduza o paralelismo excessivo de gravação. Por exemplo, use as operações do Spark .coalesce() ou .repartition() para reduzir o número de partições de saída do Spark antes de gravar no Amazon S3. Também é possível reduzir o número de núcleos por executor ou reduzir o número de executores.
- Se você observar erros quando o trabalho tenta ler a partir do bucket de origem, ajuste o tamanho dos objetos. Para reduzir o número de objetos lidos pelo trabalho, agregue objetos menores aos maiores. 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 do desempenho 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”?