Como resolvo o erro de consulta “HIVE_CANNOT_OPEN_SPLIT” do Athena?
Minha consulta ao Amazon Athena falhou com o erro “HIVE_CANNOT_OPEN_SPLIT”.
Breve descrição
Um bucket do Amazon Simple Storage Service (Amazon S3) pode lidar com 3.500 solicitações PUT/COPY/POST/DELETE ou 5.500 solicitações GET/HEAD por segundo por prefixo em um bucket. Esse limite rígido é combinado em todos os usuários e serviços de uma conta da AWS.
Por padrão, o Amazon S3 é escalado automaticamente para aceitar altas taxas de solicitação. Quando a taxa de solicitação é escalada, seu bucket do S3 é automaticamente particionado para aceitar a taxas de solicitação mais altas. No entanto, se o limite de solicitação for excedido, você receberá os erros “5xx Slow Down”.
Por exemplo, você executa uma consulta ao Athena em um prefixo que contém 10.000 arquivos. O Athena usou as solicitações GET/HEAD para tentar ler todos os 10.000 arquivos ao mesmo tempo. No entanto, como o prefixo aceita até 5.500 solicitações GET/HEAD por segundo, suas solicitações do S3 são limitadas e você recebe o erro “5xx Slow Down”.
Resolução
Use um ou mais dos métodos a seguir para que as solicitações não sejam limitadas.
Distribua objetos e solicitações do S3 entre vários prefixos
Para ajudar você a distribuir objetos e solicitações em vários prefixos, particione seus dados. Não armazene um grande número de arquivos em um único prefixo S3. Em vez disso, use vários prefixos para distribuir os objetos do S3 entre esses prefixos. Para obter mais informações, consulte Particionar dados no Athena.
Por exemplo, não armazene todos os arquivos em s3://my-athena-bucket/my-athena-data-files. Em vez disso, particione os dados e armazene-os sob os seguintes prefixos individuais:
s3://my-athena-bucket/jan
s3://my-athena-bucket/feb
s3://my-athena-bucket/mar
Você pode particionar ainda mais os dados nesses arquivos para aumentar a distribuição de objetos, como s3://my-athena-bucket/jan/01.
Reduza o número de arquivos em cada prefixo
Você pode receber o erro “HIVE_CANNOT_OPEN_SPLIT” ao consultar um bucket do S3 que tem um grande número de objetos pequenos. Por exemplo, se houver um arquivo de 100 MB em um bucket do S3, o Athena deverá fazer uma solicitação GET para ler o arquivo. No entanto, para 1.000 arquivos a cada 100 KB, o Athena deve fazer 1.000 solicitações GET para ler os mesmos 100 MB de dados. As solicitações então excedem os limites de solicitação do S3.
Para reduzir o número de solicitações do Amazon S3, reduza o número de arquivos. Por exemplo, use a ferramenta S3DistCp para mesclar um grande número de arquivos pequenos (menos de 128 MB) em um número menor de arquivos grandes. Para obter mais informações, consulte a seção Optimize file sizes nas Top 10 performance tuning tips for Amazon Athena.
Exemplo de comando:
s3-dist-cp --src=s3://my_athena_bucket_source/smallfiles/ --dest=s3://my_athena_bucket_target/largefiles/ --groupBy='.*(.csv)'
Observação: no comando anterior, substitua my_athena_bucket_source pelo bucket S3 de origem onde existem os arquivos pequenos. Além disso, substitua my_athena_bucket_target com o bucket do S3 de destino onde a saída será armazenada.
Para otimizar o desempenho e o custo da consulta, use a opção GroupBy para agregar arquivos pequenos em menos arquivos grandes.
Observação: S3DistCp não oferece suporte à concatenação para arquivos Parquet. Em vez disso, use o PySpark. Para obter mais informações, consulte Como posso concatenar arquivos Parquet no Amazon EMR?
Verifique se o versionamento está habilitado para seu bucket do S3
Quando você exclui objetos de um bucket do S3 que usa versionamento, o Amazon S3 não remove permanentemente o objeto. Em vez disso, o Amazon S3 insere um marcador de exclusão. Se muitos arquivos em seu bucket do S3 tiverem marcadores de exclusão, você poderá receber o erro “HIVE_CANNOT_OPEN_SPLIT”. Quando você executa uma consulta em um bucket que tem o versionamento ativado, o Athena precisa verificar as diferentes versões de cada objeto. Então, à medida que a consulta é processada, o Athena decide se deseja incluir um objeto específico.
Para resolver esse problema, remova os marcadores de exclusão do seu bucket do S3. Para remover os marcadores de exclusão, execute uma das seguintes ações:
- Exclua manualmente os marcadores de exclusão. Use a API ListObjectVersions para listar os metadados de todas as versões dos objetos no bucket do S3. Nos metadados, localize o versionID do objeto e, em seguida, remova permanentemente o marcador de exclusão.
- Defina uma configuração de ciclo de vida para excluir os marcadores de exclusão. Use as regras do ciclo de vida do S3 para definir as ações que você deseja que o Amazon S3 realize durante a vida útil de um objeto.
Verifique se outros aplicativos usam o mesmo prefixo S3
Use a métrica Amazon CloudWatch 5xxErrors e os logs de acesso ao servidor S3 para verificar se outros aplicativos usaram o mesmo prefixo S3 quando você executou a consulta Athena. Vários aplicativos que tentaram ler os dados do mesmo prefixo do S3 podem resultar em solicitações limitadas. Evite programar aplicações que acessem o mesmo prefixo ao mesmo tempo. Além disso, use prefixos diferentes do S3 para a fonte de dados do Athena e da aplicação.
Crie uma configuração de métricas do CloudWatch para todos os objetos em seu bucket do S3. Use essas métricas para monitorar as métricas de taxa de chamadas da API para um prefixo específico em um determinado momento. Ative as métricas de solicitação do S3 para um prefixo para entender a taxa geral de chamadas de API para um prefixo em um determinado momento. Use essas informações junto com os registros de acesso do servidor S3 para encontrar o aplicativo que usou a chamada de API para o prefixo.
Para particionar seus dados em uma única partição, você também pode colocar seus dados em buckets. Para obter mais informações, consulte O que é o DNS?
Informações relacionadas
Como faço para solucionar um erro HTTP 500 ou 503 do Amazon S3?
Vídeos relacionados
Conteúdo relevante
- AWS OFICIALAtualizada há 4 anos
- AWS OFICIALAtualizada há 4 anos
- AWS OFICIALAtualizada há 9 meses
- AWS OFICIALAtualizada há 2 anos