Questa pagina spiega come risolvere i problemi relativi alle cause comuni di lentezza o blocco dei job batch e di streaming Dataflow.
Streaming
Se noti i seguenti sintomi, il job di streaming Dataflow potrebbe essere in esecuzione lentamente o bloccato:
- La pipeline non legge i dati dall'origine. Ad esempio, Pub/Sub ha un backlog in crescita.
- La pipeline non scrive dati nel sink.
- La metrica di aggiornamento dei dati è in aumento.
- La metrica della latenza di sistema è in aumento.
Utilizza le informazioni riportate nelle sezioni seguenti per identificare e diagnosticare il problema.
Identificare la causa principale
Controlla le metriche Aggiornamento dei dati e Byte backlog.
- Se entrambe le metriche aumentano in modo monotono, significa che la pipeline è bloccata e non procede.
- Se l'aggiornamento dei dati aumenta, ma i byte backlog rimangono normali, significa che uno o più elementi di lavoro sono bloccati nella pipeline.
Cerca le fasi in cui queste metriche aumentano per identificare eventuali fasi con problemi e le operazioni eseguite in quella fase.
Controlla il grafico dell'elaborazione parallela per verificare se una fase è bloccata a causa di un parallelismo eccessivo o insufficiente. Consulta la sezione Risolvere i problemi di parallelismo.
Controlla i log dei job per rilevare problemi come limiti di quota, problemi di esaurimento delle scorte o esaurimento degli indirizzi IP.
Controlla i log del worker per individuare avvisi ed errori.
- Se i log del worker contengono errori, visualizza la analisi dello stack. Verifica se l'errore è causato da un bug nel codice.
- Cerca gli errori di Dataflow. Consulta la sezione Risolvere gli errori di Dataflow.
- Cerca errori che indicano che il job ha superato un limite, ad esempio le dimensioni massime del messaggio Pub/Sub.
- Cerca errori di esaurimento della memoria, che possono causare il blocco di una pipeline. Se visualizzi errori di memoria insufficiente, segui i passaggi descritti in Risolvere gli errori di memoria insufficiente di Dataflow.
- Per identificare un passaggio lento o bloccato, controlla i log del worker per i messaggi
Operation ongoing
. Visualizza l'analisi dello stack per vedere dove il passaggio trascorre il tempo. Per ulteriori informazioni, vedi Elaborazione bloccata o operazione in corso.
Se un elemento di lavoro è bloccato su un worker specifico, riavvia la VM worker.
Se non utilizzi Streaming Engine, controlla i log di Shuffler per avvisi ed errori. Se visualizzi un errore di timeout RPC sulla porta 12345 o 12346, è possibile che nel job manchi una regola firewall. Consulta Regole firewall per Dataflow.
Se Runner v2 è abilitato, controlla la presenza di errori nei log dell'imbracatura. Per ulteriori informazioni, consulta Risoluzione dei problemi di Runner v2.
Esamina gli errori ripetuti
In un job di streaming, alcuni errori vengono riprovati all'infinito. Questi tentativi impediscono l'avanzamento della pipeline. Per identificare errori ripetuti, controlla i log del worker per le eccezioni.
- Se l'eccezione riguarda il codice utente, esegui il debug e correggi il problema nel codice o nei dati.
- Per evitare che errori imprevisti blocchino la pipeline, implementa una coda di messaggi non recapitabili. Per un esempio di implementazione, vedi BigQuery patterns nella documentazione di Apache Beam.
- Se l'eccezione è un errore di memoria insufficiente (OOM), consulta Risolvere i problemi relativi agli errori di memoria insufficiente di Dataflow.
- Per altre eccezioni, consulta Risolvere gli errori di Dataflow.
Identificare i worker non integri
Se i worker che elaborano il job di streaming non sono integri, il job potrebbe essere lento o bloccato. Per identificare i worker non integri:
- Verifica la pressione della memoria utilizzando le metriche di utilizzo della memoria e cercando errori di esaurimento della memoria nei log dei worker. Per ulteriori informazioni, vedi Risolvere i problemi di Dataflow relativi agli errori di memoria insufficiente.
- Se utilizzi Streaming Engine, utilizza le metriche di persistenza per identificare i colli di bottiglia con le operazioni di input/output del disco (IOPS).
- Controlla i log del worker per altri errori. Per saperne di più, vedi Utilizzare i log della pipeline e Risolvere gli errori di Dataflow.
Identificare gli elementi in ritardo
Un elemento in ritardo è un elemento di lavoro lento rispetto ad altri elementi di lavoro nella fase. Per informazioni su come identificare e correggere gli elementi in ritardo, vedi Risolvere i problemi relativi agli elementi in ritardo nei job di streaming.
Risolvere i problemi di parallelismo
Per scalabilità ed efficienza, Dataflow esegue le fasi della pipeline in parallelo su più worker. L'unità più piccola di elaborazione parallela in Dataflow è una chiave. I messaggi in entrata per ogni fase unita sono associati a una chiave. La chiave è definita in uno dei seguenti modi:
- La chiave è definita implicitamente dalle proprietà dell'origine, ad esempio le partizioni Kafka.
- La chiave è definita esplicitamente dalla logica di aggregazione nella pipeline, ad esempio
GroupByKey
.
In Dataflow, i thread worker sono responsabili della gestione dell'elaborazione dei
bundle di lavoro (messaggi) per una chiave. Il numero di thread disponibili per elaborare le chiavi del job è
pari a num_of_workers * threads_per_worker
. Il numero di thread per worker
è determinato in base all'SDK (Java, Python o Go) e al tipo di job (batch o streaming).
Se la pipeline non ha abbastanza chiavi per una determinata fase, limita l'elaborazione parallela. Questa fase potrebbe diventare un collo di bottiglia.
Se la pipeline utilizza un numero molto elevato di chiavi per una determinata fase, può limitare la velocità effettiva della fase e accumulare backlog nelle fasi precedenti, perché c'è un sovraccarico per chiave. Le spese generali potrebbero includere la comunicazione del backend con i worker, le RPC esterne a un sink come BigQuery e altre elaborazioni. Ad esempio, se l'elaborazione di una chiave con un messaggio richiede 100 ms, potrebbe essere necessario anche circa 100 ms per elaborare 1000 messaggi nel bundle di chiavi.
Identificare le fasi con parallelismo basso
Per identificare se la lentezza della pipeline è causata da un basso parallelismo, visualizza le metriche di utilizzo della CPU. Se l'utilizzo della CPU è basso, ma distribuito uniformemente tra i worker, il job potrebbe avere un parallelismo insufficiente. Se il job utilizza Streaming Engine, per verificare se una fase ha un parallelismo basso, nella scheda Metriche job, visualizza le metriche di parallelismo. Per risolvere il problema:
- Nella console Google Cloud , nella pagina Informazioni sul job, utilizza la scheda Scalabilità automatica per verificare se il job ha problemi di scalabilità. Se il problema è la scalabilità automatica, consulta Risolvere i problemi relativi alla scalabilità automatica di Dataflow.
- Utilizza il grafico del job per controllare i passaggi
della fase. Se la fase legge da un'origine o scrive in un sink, consulta la documentazione del servizio dell'origine o del sink. Utilizza la documentazione per determinare se il servizio è
configurato per una scalabilità sufficiente.
- Per raccogliere ulteriori informazioni, utilizza le metriche di input e output fornite da Dataflow.
- Se utilizzi Kafka, controlla il numero di partizioni Kafka. Per saperne di più, consulta la documentazione di Apache Kafka.
- Se utilizzi un sink BigQuery, attiva lo sharding automatico per migliorare il parallelismo. Per saperne di più, consulta Triplica il throughput di Dataflow con lo sharding automatico per BigQuery.
Identificare le fasi con parallelismo elevato
Una combinazione di bassa latenza di sistema, crescente frequenza di aggiornamento dei dati e aumento del backlog e delle CPU dei worker sottoutilizzate suggerisce che la pipeline viene limitata a causa di un numero elevato di chiavi. Controlla il grafico Elaborazione parallela per identificare le fasi con un numero elevato di chiavi.
Trasformazioni come Reshuffle
possono generare milioni di chiavi se non specifichi esplicitamente
withNumBuckets
.
Un numero elevato di chiavi può portare alla creazione di numerosi bundle di lavoro più piccoli,
ognuno dei quali richiede un thread worker dedicato per l'elaborazione. Poiché i
thread worker disponibili sono limitati, può verificarsi un backlog significativo di
chiavi di elaborazione, causando ritardi in quanto attendono le risorse. Di conseguenza, i
thread di lavoro non vengono utilizzati in modo efficiente.
Ti consigliamo di limitare il numero di chiavi impostando l'opzione withNumBuckets
nella trasformazione Reshuffle
. Il valore non deve superare il numero totale di
thread in tutti i worker. Le chiavi di (threads_per_worker * max_workers)
targeting nella pipeline potrebbero non essere ottimali. A volte sono possibili meno chiavi e bundle più grandi, che vengono elaborati in modo più efficiente da Dataflow grazie all'utilizzo di un numero inferiore di worker. Un numero inferiore di chiavi crea bundle di lavoro più grandi, che utilizzano in modo efficiente i thread di worker e aumentano il throughput dello stage.
Se nella pipeline sono presenti più passaggi Reshuffle
, dividi il numero totale
di thread per il conteggio dei passaggi Reshuffle
per calcolare withNumBuckets
.
Controllare la presenza di tasti di scelta rapida
Se le attività sono distribuite in modo non uniforme tra i worker e l'utilizzo dei worker è molto irregolare, la pipeline potrebbe avere un tasto di scelta rapida. Una hot key è una chiave che ha molti più elementi da elaborare rispetto alle altre chiavi.
Controlla le scorciatoie da tastiera utilizzando il seguente filtro dei log:
resource.type="dataflow_step"
resource.labels.job_id=JOB_ID
jsonPayload.line:"hot_key_logger"
Sostituisci JOB_ID con l'ID del tuo job.
Per risolvere il problema, esegui uno o più dei seguenti passaggi:
- Riassegna le chiavi ai tuoi dati. Per generare nuove coppie chiave-valore, applica una trasformazione
ParDo
. Per saperne di più, consulta la pagina di trasformazioneParDo
Java o la pagina di trasformazioneParDo
Python nella documentazione di Apache Beam. - Utilizza
.withFanout
nelle trasformazioni combinate. Per maggiori informazioni, consulta la classeCombine.PerKey
nell'SDK Java o l'operazionewith_hot_key_fanout
nell'SDK Python. - Se hai una pipeline Java che elabora
PCollections
senza limiti di volume elevato, ti consigliamo di procedere nel seguente modo:- Utilizza
Combine.Globally.withFanout
anzichéCombine.Globally
. - Utilizza
Combine.PerKey.withHotKeyFanout
anzichéCount.PerKey
.
- Utilizza
Controllare se la quota è insufficiente
Assicurati di avere una quota sufficiente per l'origine e la destinazione. Ad esempio, se la pipeline legge l'input da Pub/Sub o BigQuery, il progetto potrebbe non disporre di una quota sufficiente. Google Cloud Per saperne di più sui limiti di quota per questi servizi, consulta Quota Pub/Sub o Quota BigQuery.
Se il tuo job genera un numero elevato di errori 429 (Rate Limit Exceeded)
, potrebbe avere una quota insufficiente. Per verificare la presenza di errori, prova i seguenti passaggi:
- Vai alla Google Cloud console.
- Nel riquadro di navigazione, fai clic su API e servizi.
- Nel menu, fai clic su Raccolta.
- Utilizza la casella di ricerca per cercare Pub/Sub.
- Fai clic su API Cloud Pub/Sub.
- Fai clic su Gestisci.
- Nel grafico Traffico per codice di risposta, cerca i codici di errore client
(4xx)
.
Puoi anche utilizzare Metrics Explorer per controllare l'utilizzo della quota. Se la pipeline utilizza un'origine o un sink BigQuery, per risolvere i problemi relativi alla quota, utilizza le metriche dell'API BigQuery Storage. Ad esempio, per creare un grafico che mostri il conteggio delle connessioni simultanee BigQuery, segui questi passaggi:
Nella console Google Cloud , seleziona Monitoring:
Nel riquadro di navigazione, seleziona Metrics Explorer.
Nel riquadro Seleziona una metrica, per Metrica, filtra in base a Progetto BigQuery > Scrittura > Conteggio connessioni simultanee.
Per istruzioni sulla visualizzazione delle metriche Pub/Sub, consulta Monitorare l'utilizzo della quota in "Monitorare Pub/Sub in Cloud Monitoring". Per istruzioni sulla visualizzazione delle metriche BigQuery, consulta Visualizzare l'utilizzo e i limiti delle quote in "Creare dashboard, grafici e avvisi".
Batch
Se il job batch è lento o bloccato, utilizza la scheda Dettagli di esecuzione per trovare maggiori informazioni sul job e per identificare la fase o il worker che sta causando un collo di bottiglia.
Identificare la causa principale
Controlla se il job presenta problemi durante l'avvio del worker. Per saperne di più, vedi Errore di sincronizzazione del pod.
Per verificare che il job abbia iniziato a elaborare i dati, cerca la seguente voce di log nel log job-message:
All workers have finished the startup processes and began to receive work requests
Per confrontare le prestazioni dei job tra job diversi, assicurati che il volume di dati di input, la configurazione dei worker, il comportamento di scalabilità automatica e le impostazioni di Dataflow Shuffle siano gli stessi.
Controlla i log job-message per problemi come limiti di quota, problemi di esaurimento delle scorte o esaurimento degli indirizzi IP.
Nella scheda Dettagli di esecuzione, confronta l'avanzamento della fase per identificare le fasi che hanno richiesto più tempo.
Cerca eventuali elementi rimanenti nel job. Per saperne di più, vedi Risoluzione dei problemi relativi ai processi batch in ritardo.
Controlla le metriche relative a velocità effettiva, CPU e utilizzo della memoria.
Controlla la presenza di avvisi ed errori nei log dei worker.
- Se i log del worker contengono errori, visualizza la analisi dello stack. Verifica se l'errore è causato da un bug nel codice.
- Cerca gli errori di Dataflow. Consulta la sezione Risolvere gli errori di Dataflow.
- Cerca errori di esaurimento della memoria, che possono causare il blocco di una pipeline. Se visualizzi errori di memoria insufficiente, segui i passaggi descritti in Risolvere i problemi di memoria insufficiente di Dataflow.
- Per identificare un passaggio lento o bloccato, controlla i log del worker per i messaggi
Operation ongoing
. Visualizza l'analisi dello stack per vedere dove il passaggio trascorre il tempo. Per ulteriori informazioni, vedi Elaborazione bloccata o operazione in corso.
Se non utilizzi Dataflow Shuffle, controlla i log di Shuffler per avvisi ed errori durante l'operazione di shuffle. Se visualizzi un errore di timeout RPC sulla porta 12345 o 12346, è possibile che nel job manchi una regola firewall. Consulta Regole firewall per Dataflow.
Se Runner v2 è abilitato, controlla i log della briglia per verificare la presenza di errori. Per ulteriori informazioni, consulta Risolvere i problemi di Runner v2.
Identificare gli elementi in ritardo
Un elemento in ritardo è un elemento di lavoro lento rispetto ad altri elementi di lavoro nella fase. Per informazioni su come identificare e correggere i ritardatari, vedi Risolvere i problemi relativi ai ritardatari nei job batch.
Identificare le fasi lente o bloccate
Per identificare le fasi lente o bloccate, utilizza la visualizzazione Avanzamento fase. Le barre più lunghe indicano che la fase richiede più tempo. Utilizza questa visualizzazione per identificare le fasi più lente della pipeline.
Una volta individuata la fase del collo di bottiglia, puoi procedere nel seguente modo:
- Identifica il worker in ritardo all'interno di quella fase.
- Se non ci sono worker in ritardo, identifica il passaggio più lento utilizzando il riquadro Informazioni sullo stato. Utilizza queste informazioni per identificare i candidati per l'ottimizzazione del codice utente.
- Per trovare i colli di bottiglia del parallelismo, utilizza le metriche di monitoraggio di Dataflow.
Identificare un lavoratore in ritardo
Per identificare un worker in ritardo per una fase specifica, utilizza la visualizzazione Avanzamento worker. Questa visualizzazione mostra se tutti i worker elaborano il lavoro fino alla fine della fase o se un singolo worker è bloccato su un'attività in ritardo. Se trovi un lavoratore in ritardo, procedi nel seguente modo:
- Visualizza i file di log per il worker. Per saperne di più, consulta Monitorare e visualizzare i log delle pipeline.
- Visualizza le metriche di utilizzo della CPU e i dettagli dell'avanzamento dei worker per i worker in ritardo. Se noti un utilizzo della CPU insolitamente alto o basso, nei file di log del worker, cerca i seguenti problemi:
Strumenti per il debug
Quando una pipeline è lenta o bloccata, i seguenti strumenti possono aiutarti a diagnosticare il problema.
- Per correlare gli incidenti e identificare i colli di bottiglia, utilizza Cloud Monitoring per Dataflow.
- Per monitorare le prestazioni della pipeline, utilizza Cloud Profiler.
- Alcune trasformazioni sono più adatte alle pipeline ad alto volume rispetto ad altre. I messaggi di log possono identificare una trasformazione dell'utente bloccata nelle pipeline batch o di streaming.
- Per saperne di più su un job bloccato, utilizza le
metriche dei job Dataflow.
Il seguente elenco include metriche utili:
- La metrica Byte backlog (
backlog_bytes
) misura la quantità di input non elaborati in byte per fase. Utilizza questa metrica per trovare un passaggio unito che non ha throughput. Allo stesso modo, la metrica Elementi backlog (backlog_elements
) misura il numero di elementi di input non elaborati per una fase. - La metrica Chiavi di parallelismo dell'elaborazione
(
processing_parallelism_keys
) misura il numero di chiavi di elaborazione parallela per una determinata fase della pipeline negli ultimi cinque minuti. Utilizza questa metrica per eseguire indagini nei seguenti modi:- Restringi il problema a fasi specifiche e conferma gli avvisi relativi ai tasti di scelta rapida, ad esempio
A hot key ... was detected
. - Trova i colli di bottiglia del throughput causati da un parallelismo insufficiente. Questi colli di bottiglia possono causare pipeline lente o bloccate.
- Restringi il problema a fasi specifiche e conferma gli avvisi relativi ai tasti di scelta rapida, ad esempio
- La metrica Ritardo sistema (
system_lag
) e la metrica Ritardo sistema per fase (per_stage_system_lag
) misurano il tempo massimo per cui un elemento di dati è stato elaborato o è in attesa di elaborazione. Utilizza queste metriche per identificare le fasi inefficienti e i colli di bottiglia delle origini dati.
- La metrica Byte backlog (
Per ulteriori metriche non incluse nell'interfaccia web di monitoraggio di Dataflow, consulta l'elenco completo delle metriche di Dataflow in Google Cloud metriche.