Come posso risolvere l'errore di query "HIVE_CANNOT_OPEN_SPLIT" di Athena?
La mia query su Amazon Athena non è riuscita con l'errore "HIVE_CANNOT_OPEN_SPLIT".
Breve descrizione
Un bucket Amazon Simple Storage Service (Amazon S3) può gestire 3.500 richieste PUT/COPY/POST/DELETE o 5.500 richieste GET/HEAD al secondo per prefisso in un bucket. Questo limite rigido è cumulato tra tutti gli utenti e i servizi di un account AWS.
Per impostazione predefinita, Amazon S3 si ridimensiona automaticamente per supportare tassi di richiesta elevati. Quando la frequenza delle richieste aumenta, il bucket S3 viene automaticamente partizionato per supportare tassi di richiesta più elevati. Tuttavia, se la soglia di richiesta viene superata, vengono visualizzati gli errori "5xx Slow Down".
Ad esempio, si esegue una query Athena su un prefisso che contiene 10.000 file. Athena ha utilizzato le richieste GET/HEAD per provare a leggere tutti i 10.000 file contemporaneamente. Tuttavia, poiché il prefisso supporta solo 5.500 richieste GET/HEAD al secondo, le richieste S3 vengono limitate e viene visualizzato l'errore "5xx Slow Down".
Risoluzione
Utilizza uno o più dei seguenti metodi in modo che le richieste non vengano limitate.
Distribuisci oggetti e richieste S3 tra più prefissi
Per aiutarti a distribuire oggetti e richieste su più prefissi, partiziona i dati. Non archiviare un numero elevato di file con un unico prefisso S3. Utilizza invece più prefissi per distribuire gli oggetti S3 tra questi prefissi. Per ulteriori informazioni, consulta Partizionare dati su Athena.
Ad esempio, non archiviare tutti i file in s3://my-athena-bucket/my-athena-data-files. Invece, partiziona i dati e memorizzali con i seguenti prefissi individuali:
s3://my-athena-bucket/jan
s3://my-athena-bucket/feb
s3://my-athena-bucket/mar
È possibile partizionare ulteriormente i dati in questi file per aumentare la distribuzione di oggetti come s3://my-athena-bucket/jan/01.
Ridurre il numero di file in ogni prefisso
Potresti ricevere l'errore "HIVE_CANNOT_OPEN_SPLIT" quando interroghi un bucket S3 che contiene un numero elevato di oggetti di piccole dimensioni. Ad esempio, se in un bucket S3 c'è un file da 100 MB, Athena deve effettuare 1 richiesta GET per leggere il file. Tuttavia, per 1.000 file da 100 KB ciascuno, Athena deve effettuare 1.000 richieste GET per leggere gli stessi 100 MB di dati. Le richieste superano quindi i limiti di richiesta S3.
Per ridurre il numero di richieste Amazon S3, riduci il numero di file. Ad esempio, usa lo strumento S3DistCp per unire un numero elevato di file di piccole dimensioni (inferiori a 128 MB) in un numero minore di file di grandi dimensioni. Per ulteriori informazioni, consulta la sezione Ottimizzazione delle dimensioni dei file in Top 10 performance tuning tips for Amazon Athena.
Comando di esempio:
s3-dist-cp --src=s3://my_athena_bucket_source/smallfiles/ --dest=s3://my_athena_bucket_target/largefiles/ --groupBy='.*(.csv)'
Nota: Nel comando precedente, sostituisci my_athena_bucket_source con il bucket S3 sorgente in cui sono presenti i file di piccole dimensioni. Sostituisci anche my_athena_bucket_target con il bucket S3 di destinazione in cui verrà archiviato l'output.
Per ottimizzare le prestazioni e i costi delle query, utilizza l'opzione groupBy per aggregare file di piccole dimensioni in un numero inferiore di file di grandi dimensioni.
Nota: S3DistCp non supporta la concatenazione per i file Apache Parquet. Usa invece PySpark. Per ulteriori informazioni, consulta Come posso concatenare file Parquet in Amazon EMR?
Verifica che il controllo delle versioni sia abilitato per il tuo bucket S3
Quando elimini oggetti da un bucket S3 che utilizza il controllo delle versioni, Amazon S3 non rimuove definitivamente l'oggetto. Amazon S3 inserisce invece un indicatore di eliminazione. Se molti file nel bucket S3 hanno indicatori di eliminazione, potresti ricevere l'errore "HIVE_CANNOT_OPEN_SPLIT". Quando si esegue una query su un bucket con il controllo delle versioni attivato, Athena deve controllare le diverse versioni di ciascun oggetto. Quindi, man mano che l'interrogazione viene elaborata, Athena decide se includere un particolare oggetto.
Per risolvere questo problema, rimuovi i marker di eliminazione dal bucket S3. Per rimuovere i marcatori di eliminazione, esegui una delle seguenti azioni:
- Elimina manualmente gli indicatori di eliminazione. Usa l'API ListObjectVersions API per elencare i metadati su tutte le versioni degli oggetti nel tuo bucket S3. Dai metadati, trova la versionID dell'oggetto, quindi rimuovi definitivamente l'indicatore di eliminazione.
- Imposta una configurazione del ciclo di vita per eliminare gli indicatori di eliminazione. Usa le regole del ciclo di vita di S3 per definire le azioni che desideri che Amazon S3 intraprenda per tutta la durata di un oggetto.
Controlla se altre applicazioni utilizzano lo stesso prefisso S3
Utilizza la metrica Amazon CloudWatch 5xxErrors e i log di accesso al server S3 per verificare se altre applicazioni hanno utilizzato lo stesso prefisso S3 quando hai eseguito la query Athena. Più applicazioni che tentano di leggere i dati dallo stesso prefisso S3 possono causare richieste limitate. Evita di pianificare l'accesso contemporaneo di più applicazioni allo stesso prefisso. Inoltre, utilizza prefissi S3 diversi per l'origine dati Athena e l'origine dati dell'applicazione.
Crea una configurazione dei parametri di CloudWatch per tutti gli oggetti nel tuo bucket S3. Usa queste metriche per monitorare le metriche della frequenza di chiamata dell'API per un prefisso specifico in un determinato momento. Attiva le metriche di richiesta S3 per un prefisso per comprendere la frequenza complessiva delle chiamate API per un prefisso in un determinato momento. È possibile utilizzare queste informazioni insieme ai log di accesso al server S3 per scoprire quale applicazione stava utilizzando la chiamata API per il prefisso.
Per partizionare i dati all'interno di una singola partizione, puoi anche raggrupparli in un bucket. Per ulteriori informazioni, consulta la pagina What is bucketing?
Informazioni correlate
Come faccio a risolvere un errore HTTP 500 o 503 di Amazon S3?
- Argomenti
- Analytics
- Lingua
- Italiano
Video correlati

