Come posso risolvere i problemi relativi all'utilizzo elevato o completo del disco con Amazon Redshift?

10 minuti di lettura
0

Sto riscontrando un utilizzo elevato o completo del disco su Amazon Redshift e desidero risolvere questo problema.

Soluzione

Gli errori di utilizzo elevato del disco possono dipendere da diversi fattori, tra cui:

  • Chiave di distribuzione e ordinamento
  • Elaborazione delle query
  • Tabelle con colonne VARCHAR(MAX)
  • Elevata compressione delle colonne
  • Operazioni di manutenzione
  • Prodotti cartesiani con cross join
  • Dimensioni minime della tabella
  • Blocchi tombstone
  • Copiare un file di grandi dimensioni

Chiave di distribuzione e ordinamento

Rivedi lo stile di distribuzione, la chiave di distribuzione e la selezione della chiave di ordinamento della tabella. Le tabelle con distribuzione inclinata, in cui si trovano più dati in un nodo rispetto agli altri, possono causare un nodo del disco completo. Se disponi di tabelle con stili di distribuzione distorti, modifica lo stile di distribuzione con una distribuzione più uniforme. Tieni presente che la distribuzione e l'inclinazione delle righe possono influire sull'inclinazione dell'archiviazione e sul set di righe intermedio quando è in esecuzione una query. Per ulteriori informazioni sulle chiavi di distribuzione e sulle chiavi di ordinamento, consulta il Manuale avanzato di progettazione delle tabelle di Amazon Redshift: introduzione, prerequisiti e prioritizzazione.

Per determinare la cardinalità della chiave di distribuzione, esegui la seguente query:

SELECT <distkey column>, COUNT(*) FROM <schema name>.<table with distribution skew> GROUP BY <distkey column> HAVING COUNT(*) > 1 ORDER BY 2 DESC;

Nota: Per evitare un passaggio di ordinamento, utilizza le colonne SORT KEY nella clausola ORDER BY. Un passaggio di ordinamento può utilizzare una quantità eccessiva di memoria, causando una fuoriuscita del disco. Per ulteriori informazioni, consulta Lavorare con le chiavi di ordinamento.

Nel gruppo filtrato di risultati, scegli una colonna con un'alta cardinalità per visualizzarne la distribuzione dei dati. Per ulteriori informazioni sullo stile di distribuzione della tabella, consulta Scegli lo stile di distribuzione migliore.

Per vedere come i blocchi di database in una chiave di distribuzione vengono mappati su un cluster, utilizza l'utilità table_inspector.sql di Amazon Redshift.

Elaborazione delle query

Esamina qualsiasi memoria allocata a una query. Durante l'elaborazione di una query, i risultati intermedi possono essere archiviati in blocchi temporanei. Se la memoria libera non è sufficiente, le tabelle causano una fuoriuscita del disco. I gruppi di risultati intermedi non sono compressi, il che influisce sullo spazio disponibile su disco. Per ulteriori informazioni, consulta Memoria allocata insufficiente alla query.

Per impostazione predefinita, Amazon Redshift utilizza una struttura di tabelle con distribuzione uniforme e nessuna codifica delle colonne per le tabelle temporanee. Ma se stai usando la sintassi SELECT...INTO, utilizza un'istruzione CREATE. Per ulteriori informazioni, consulta Le 10 migliori tecniche di ottimizzazione delle prestazioni per Amazon Redshift. Segui le istruzioni riportate nel Suggerimento 6: Risolvi l'uso inefficiente delle tabelle temporanee.

Se la memoria allocata alla query è insufficiente, è possibile che venga visualizzato un passaggio in SVL_QUERY_SUMMARY dove is_diskbased mostra il valore "true". Per risolvere questo problema, aumenta il numero di slot di query per allocare più memoria alla query. Per ulteriori informazioni su come aumentare temporaneamente gli slot per una query, consulta wlm_query\ _slot\ _count o ottimizzala tua WLM per eseguire carichi di lavoro misti. È inoltre possibile utilizzare le regole di monitoraggio delle query WLM per contrastare i carichi di elaborazione pesanti e identificare le query ad alta intensità di I/O.

Tabelle con colonne VARCHAR(MAX)

Controlla le colonne VARCHAR o CHARACTER VARYING per gli spazi vuoti finali che potrebbero essere omessi quando i dati vengono archiviati sul disco. Durante l'elaborazione delle query, gli spazi vuoti finali possono occupare l'intera lunghezza della memoria (il valore massimo per VARCHAR è 65535). È consigliabile utilizzare le dimensioni della colonna più piccole possibile.

Per generare un elenco di tabelle con la larghezza massima delle colonne, esegui la seguente query:

SELECT database, schema || '.' || "table" AS "table", max_varchar FROM svv_table_info WHERE max_varchar > 150 ORDER BY 2;

Per identificare e visualizzare la larghezza reale delle ampie colonne della tabella VARCHAR, esegui la seguente query:

SELECT max(octet_length (rtrim(column_name))) FROM table_name;

Nell'output di questa query, verifica se la lunghezza è appropriata per il tuo caso d'uso. Se le colonne hanno lunghezza massima e superano le tue esigenze, regolane la lunghezza in base alle dimensioni minime necessarie.

Per ulteriori informazioni sulla progettazione delle tabelle, consulta le Best practice di Amazon Redshift per la progettazione di tabelle.

Elevata compressione delle colonne

Codifica tutte le colonne (tranne la chiave di ordinamento) utilizzando ANALYZE COMPRESSION o utilizzando la funzionalità di ottimizzazione automatica delle tabelle in Amazon Redshift. Amazon Redshift fornisce la codifica delle colonne. È consigliabile utilizzare questa funzionalità, anche se aumenta le prestazioni di lettura e riduce il consumo complessivo di spazio di archiviazione.

Operazioni di manutenzione

Assicurati che le tabelle nel tuo database Amazon Redshift vengano analizzate e ripassate regolarmente. Identifica tutte le query eseguite su tabelle prive di statistiche. Impedire che le query vengano eseguite su tabelle prive di statistiche impedisce ad Amazon Redshift di scansionare righe di tabella non necessarie. Questo aiuta anche a ottimizzare l'elaborazione delle query.

Nota: Le operazioni di manutenzione come VACUUM e DEEP COPY utilizzano spazio di archiviazione temporaneo per le operazioni di ordinamento, quindi è previsto un picco nell'utilizzo del disco.

Ad esempio, la seguente query ti aiuta a identificare statistiche obsolete in Amazon Redshift:

SELECT * FROM svv_table_info WHERE stats_off > 10 ORDER BY size DESC;

Inoltre, utilizza il comando ANALYZE per visualizzare e analizzare le statistiche delle tabelle.

Per ulteriori informazioni sulle operazioni di manutenzione, consulta l'utilità dello schema Analyze & Vacuum di Amazon Redshift.

Prodotti cartesiani con cross join

Usa il piano EXPLAIN della query per cercare le query con prodotti cartesiani. I prodotti cartesiani sono cross join che non sono correlati e possono produrre un numero maggiore di blocchi. Queste cross join possono comportare un maggiore utilizzo della memoria e la fuoriuscita di più tabelle sul disco. Se le cross join non condividono una condizione JOIN, producono un prodotto cartesiano di due tabelle. Ogni riga di una tabella viene quindi unita a tutte le righe dell'altra tabella.

Le cross join possono anche essere eseguite come loop join annidate, che richiedono più tempo per l'elaborazione. Le loop join annidate provocano picchi nell'utilizzo complessivo del disco. Per ulteriori informazioni, consulta Identificazione delle query con loop annidati.

Dimensioni minime della tabella

La stessa tabella può avere dimensioni diverse in diversi cluster. Le dimensioni minime della tabella sono quindi determinate in base al numero di colonne e se la tabella ha una SORTKEY e il numero di sezioni popolate. Se hai recentemente ridimensionato un cluster Amazon Redshift, potresti notare una modifica nello spazio di archiviazione complessivo su disco. Ciò è causato dalla modifica del numero di sezioni. Amazon Redshift conta anche i segmenti di tabella utilizzati da ciascuna tabella. Per ulteriori informazioni, consulta Perché una tabella in un cluster Amazon Redshift consuma più o meno spazio di archiviazione su disco del previsto?

Blocchi tombstone

I blocchi tombstone sono generati quando si verificano una transazione WRITE su una tabella Amazon Redshift e una lettura simultanea. Amazon Redshift mantiene i blocchi prima dell'operazione di scrittura per mantenere coerente un'operazione di lettura simultanea. I blocchi Amazon Redshift non possono essere modificati. Ogni azione Inserisci, Aggiorna o Elimina crea un nuovo gruppo di blocchi, contrassegnando i vecchi blocchi come lapidati.

A volte i tombstone non vengono cancellati nella fase di commit a causa di transazioni di tabelle di lunga esecuzione. I tombstone possono anche non essere eliminati quando sono presenti troppi carichi ETL in esecuzione contemporaneamente. Poiché Amazon Redshift monitora il database dal momento in cui inizia la transazione, qualsiasi tabella scritta nel database conserva anche i blocchi tombstone. Se le transazioni di tabelle di lunga esecuzione si verificano regolarmente e su più carichi, è possibile che si accumuli un numero di tombstone sufficiente a causare un errore Disk Full.

Puoi anche forzare Amazon Redshift a eseguire l'analisi relativa ai blocchi tombstone eseguendo un comando commit.

Se sono attive query di lunga esecuzione, terminale (e rilascia tutti i blocchi successivi) utilizzando il comando commit:

begin;
create table a (id int);
insert into a values(1);
commit;
drop table a;

Quindi, per confermare i blocchi tombstone, esegui la seguente query:

select trim(name) as tablename, count(case when tombstone > 0 then 1 else null end) as tombstones from svv_diskusage group by 1 having count(case when tombstone > 0 then 1 else null end) > 0 order by 2 desc;

Copiare un file di grandi dimensioni

Durante un'operazione COPY, è possibile che venga visualizzato un errore Disk Full anche se lo spazio di archiviazione disponibile è sufficiente. Questo errore si verifica se l'operazione di ordinamento si riversa su disco, creando blocchi temporanei.

Se ricevi un messaggio di errore Disk Full, controlla la tabella STL\ _DISK\ _FULL\ _DIAG. Controlla quale ID di query ha causato l'errore e i blocchi temporanei che sono stati creati:

select '2000-01-01'::timestamp + (currenttime/1000000.0)* interval '1 second' as currenttime,node_num,query_id,temp_blocks from pg_catalog.stl_disk_full_diag;

Per ulteriori best practice, consulta le Best practice di Amazon Redshift per il caricamento dei dati.

Risoluzione di problemi aggiuntivi

Controlla la percentuale di spazio su disco nella scheda Prestazioni della console Amazon Redshift. Per ogni nodo del cluster, Amazon Redshift offre spazio aggiuntivo su disco maggiore della capacità nominale del disco.

Se noti un improvviso picco di utilizzo, usa STL\ _QUERY per identificare le attività e i lavori in esecuzione. Nota quali query sono in esecuzione al momento della fuoriuscita di un disco:

select * from stl_query where starttime between '2018-01-01 00:30:00' and '2018-01-01 00:40:00';

Nota: Aggiorna i valori con l'ora in cui si è verificato il picco.

Per identificare le 20 principali query relative alla fuoriuscita di dati su disco, esegui la seguente query:

select A.userid, A.query, blocks_to_disk, trim(B.querytxt) text from stl_query_metrics A, stl_query B where A.query = B.query and segment=-1 and step = -1 and max_blocks_to_disk > 0 order by 3 desc limit 20;

Visualizza il valore della colonna blocks_to_disk per identificare la fuoriuscita del disco. Se necessario, interrompi le query che generano troppe informazioni. Quindi, alloca memoria aggiuntiva alle query prima di eseguirle nuovamente. Per ulteriori dettagli, fai riferimento a STL\ _QUERY\ _METRICS.

Per determinare se le tue query vengono scritte correttamente su un disco, esegui la seguente query:

SELECT q.query, trim(q.cat_text)
FROM (
SELECT query,
replace( listagg(text,' ') WITHIN GROUP (ORDER BY sequence), '\\n', ' ') AS cat_text
FROM stl_querytext
WHERE userid>1
GROUP BY query) q
JOIN (
SELECT distinct query
FROM svl_query_summary
WHERE is_diskbased='t' AND (LABEL ILIKE 'hash%' OR LABEL ILIKE 'sort%' OR LABEL ILIKE 'aggr%' OR LABEL ILIKE 'save%' OR LABEL ILIKE 'window%' OR LABEL ILIKE 'unique%')
AND userid > 1) qs
ON qs.query = q.query;

Questo comando identifica anche le query che vengono trasferite su disco.


Informazioni correlate

Prestazioni

Panoramica del sistema Amazon Redshift

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa