Questo documento illustra le best practice per ottimizzare i job Dataflow con l'obiettivo di ridurre al minimo i costi. Spiega i fattori che influiscono sui costi e fornisce tecniche per monitorarli e gestirli.
Per saperne di più su come vengono calcolati i costi per i job Dataflow, consulta Prezzi di Dataflow.
Diversi fattori possono avere un impatto significativo sul costo del job:
- Impostazioni runtime
- Prestazioni della pipeline
- Requisiti di throughput della pipeline
Le sezioni seguenti forniscono dettagli su come monitorare i job, sui fattori che influiscono sul costo dei job e suggerimenti su come migliorare l'efficienza della pipeline.
Definisci gli SLO
Prima di iniziare l'ottimizzazione, definisci gli obiettivi del livello di servizio (SLO) della pipeline, in particolare per la velocità effettiva e la latenza. Questi requisiti ti aiuteranno a valutare i compromessi tra i costi e altri fattori.
- Se la pipeline richiede una bassa latenza di importazione end-to-end, i costi della pipeline potrebbero essere più elevati.
- Se devi elaborare dati che arrivano in ritardo, il costo complessivo della pipeline potrebbe essere più elevato.
- Se la pipeline di streaming presenta picchi di dati che devono essere elaborati, potrebbe essere necessaria una capacità aggiuntiva, il che può aumentare i costi.
Monitora i job
Per determinare come ottimizzare il job, devi prima comprenderne il comportamento. Utilizza gli strumenti di monitoraggio di Dataflow per osservare la pipeline durante l'esecuzione. Poi utilizza queste informazioni per migliorare le prestazioni e l'efficienza.
Monitoraggio dei costi
Utilizza le seguenti tecniche per prevedere e monitorare i costi.
- Prima di eseguire la pipeline in produzione, esegui uno o più job più piccoli su un sottoinsieme dei tuoi dati. Per molte pipeline, questa tecnica può fornire una stima dei costi.
- Utilizza la pagina Costo nell'interfaccia di monitoraggio di Dataflow per monitorare il costo stimato dei job. Il costo stimato potrebbe non riflettere il costo effettivo del job per vari motivi, ad esempio sconti contrattuali, ma può fornire un buon riferimento per l'ottimizzazione dei costi. Per saperne di più, consulta Monitoraggio dei costi.
- Esporta i dati di fatturazione Cloud in BigQuery ed esegui un'analisi dei costi sulle tabelle di esportazione della fatturazione. L'esportazione della fatturazione Cloud ti consente di esportare automaticamente i dati di fatturazione dettagliati di Google Cloud nel corso della giornata in un set di dati BigQuery. I dati di fatturazione includono l'utilizzo, le stime dei costi e i dati sui prezzi.
- Per evitare costi imprevisti, crea avvisi di monitoraggio quando il job Dataflow supera una soglia definita da te. Per saperne di più, consulta Utilizza Cloud Monitoring per le pipeline Dataflow.
Monitoraggio dei job
Monitora i job e identifica le aree in cui potresti migliorare l'efficienza della pipeline.
- Utilizza l'interfaccia di monitoraggio dei job di Dataflow per identificare i problemi nelle pipeline. L'interfaccia di monitoraggio mostra un grafico del job e i dettagli di esecuzione per ogni pipeline. Entrambi questi strumenti possono aiutarti a comprendere la pipeline e a identificare fasi lente, fasi bloccate o passaggi con un tempo totale di esecuzione eccessivo.
- Utilizza Esplora metriche per visualizzare metriche dettagliate dei job Dataflow. Puoi utilizzare le metriche personalizzate per acquisire i dati sul rendimento. La metrica
Distributionè particolarmente utile per raccogliere dati sul rendimento. - Per le pipeline che richiedono un uso intensivo della CPU, utilizza Cloud Profiler per identificare le parti del codice della pipeline che consumano più risorse.
- Utilizza il campionamento dei dati per identificare i problemi relativi ai dati. Il campionamento dei dati ti consente di osservare i dati in ogni passaggio di una pipeline Dataflow. Mostrando gli input e gli output effettivi in un job in esecuzione o completato, queste informazioni possono aiutarti a eseguire il debug dei problemi della pipeline.
- Personalizza la dashboard di monitoraggio del progetto per mostrare i job potenzialmente costosi. Per saperne di più, consulta Personalizza la dashboard di monitoraggio di Dataflow.
Non è consigliabile registrare le metriche di elaborazione per elemento in pipeline con volumi elevati, perché il logging è soggetto a limiti e un logging eccessivo può peggiorare le prestazioni dei job.
Ottimizza le impostazioni di runtime
Le seguenti impostazioni di runtime possono influire sui costi:
- Se esegui un job in modalità flusso o un job batch
- Il servizio che utilizzi per eseguire il job, ad esempio Streaming Engine o FlexRS
- Il tipo di macchina, le dimensioni del disco e il numero di GPU nelle VM worker
- La modalità di scalabilità automatica
- Il numero iniziale di worker e il numero massimo di worker
- La modalità flusso di dati (modalità exactly-once o modalità at-least-once)
Questa sezione descrive le potenziali modifiche che puoi apportare per ottimizzare il job. Per determinare se questi suggerimenti sono appropriati per il tuo workload, considera la progettazione e i requisiti della pipeline. Non tutti i suggerimenti sono appropriati o utili per tutte le pipeline.
Prima di apportare modifiche su larga scala, testa le modifiche su piccole pipeline che utilizzano un sottoinsieme dei tuoi dati. Per saperne di più, consulta Esegui piccoli esperimenti per job di grandi dimensioni in "Best practice per pipeline batch di grandi dimensioni".
Località lavoro
La maggior parte dei job Dataflow interagisce con altri servizi, come datastore e sistemi di messaggistica. Considera dove si trovano.
- Esegui il job nella stessa regione delle risorse utilizzate dal job.
- Crea il bucket Cloud Storage per archiviare i file di gestione temporanea e dei job temporanei nella stessa regione del job. Per saperne di più, consulta le opzioni della pipeline
gcpTempLocationetemp_location.
Modifica i tipi di macchina
Le seguenti modifiche alle VM worker potrebbero migliorare l'efficienza in termini di costi.
- Esegui il job con il tipo di macchina più piccolo richiesto. Modifica il tipo di macchina in base alle esigenze della pipeline. Ad esempio, i job di flussi di dati con pipeline ad alta intensità di CPU a volte traggono vantaggio dalla modifica del tipo di macchina rispetto a quello predefinito. Per ulteriori informazioni, consulta Tipo di macchina.
- Per i workload ad alta intensità di memoria o di calcolo, utilizza tipi di macchine appropriati. Per ulteriori informazioni, consulta Punteggi CoreMark delle VM in base alla famiglia.
- Imposta il numero iniziale di worker. Quando un job esegue lo scale up, il lavoro deve essere ridistribuito alle nuove VM. Se sai di quanti worker hanno bisogno i tuoi job, puoi evitare questo costo impostando il numero iniziale di worker. Per impostare il numero iniziale di worker, utilizza l'opzione della pipeline
numWorkersonum_workers. - Imposta il numero massimo di worker. Impostando un valore per questo parametro, puoi potenzialmente limitare il costo totale del job. Quando testi la pipeline per la prima volta, inizia con un valore massimo relativamente basso. Poi aumenta il valore finché non è sufficientemente alto per eseguire un workload di produzione. Considera gli SLO della pipeline prima di impostare un valore massimo. Per saperne di più, consulta Scalabilità automatica orizzontale.
- Utilizza l'aggiustamento delle dimensioni per personalizzare i requisiti delle risorse per passaggi specifici della pipeline.
- Alcune pipeline traggono vantaggio dall'utilizzo delle GPU. Per saperne di più, consulta GPU con Dataflow. Utilizzando l'adattamento corretto, puoi configurare le GPU per passaggi specifici della pipeline.
- Assicurati di disporre di una larghezza di banda di rete sufficiente per accedere ai dati dalle VM worker, in particolare quando devi accedere ai dati on-premise.
Ottimizza le impostazioni per i job batch
Questa sezione fornisce suggerimenti per ottimizzare le impostazioni di runtime per i job batch. Per i job batch, le fasi del job vengono eseguite in sequenza, il che può influire su prestazioni e costi.
Utilizza la programmazione flessibile delle risorse
Se il job batch non è urgente, valuta la possibilità di utilizzare la pianificazione flessibile delle risorse (FlexRS). FlexRS riduce i costi di elaborazione batch trovando il momento migliore per avviare il job e utilizzando una combinazione di istanze VM preemptible e VM standard. Le VM preemptible sono disponibili a un prezzo molto inferiore rispetto alle VM standard, il che può ridurre il costo totale. Utilizzando una combinazione di VM preemptible e standard, FlexRS contribuisce a garantire che la pipeline proceda anche se Compute Engine prerilascia le VM preemptible.
Evita di eseguire job molto piccoli
Se possibile, evita di eseguire job che elaborano quantità di dati molto ridotte. Se possibile, esegui meno job su set di dati più grandi. L'avvio e l'arresto delle VM worker comporta un costo, quindi l'esecuzione di un numero inferiore di job su più dati può migliorare l'efficienza.
Assicurati che Dataflow Shuffle sia abilitato. I job batch utilizzano Dataflow Shuffle per impostazione predefinita.
Regola le impostazioni di scalabilità automatica
Per impostazione predefinita, i job batch utilizzano la scalabilità automatica. Per alcuni job, ad esempio quelli di breve durata, la scalabilità automatica non è necessaria. Se ritieni che la tua pipeline non tragga vantaggio dalla scalabilità automatica, disattivala. Per saperne di più, consulta Scalabilità automatica orizzontale.
Puoi anche utilizzare lo scaling dinamico dei thread per consentire a Dataflow di ottimizzare il numero di thread in base all'utilizzo della CPU.
In alternativa, se conosci il numero ottimale di thread per il job, imposta esplicitamente il numero di thread per worker utilizzando l'opzione della pipeline numberOfWorkerHarnessThreads o number_of_worker_harness_threads.
Interrompi i job a lunga esecuzione
Imposta i job in modo che si interrompano automaticamente se superano un tempo di esecuzione predeterminato. Se sai approssimativamente quanto tempo richiede l'esecuzione del job, utilizza l'opzione di servizio max_workflow_runtime_walltime_seconds per arrestare automaticamente il job se l'esecuzione richiede più tempo del previsto.
Ottimizza le impostazioni per i job di streaming
Questa sezione fornisce suggerimenti per ottimizzare le impostazioni di runtime per i job di streaming.
Utilizza Streaming Engine
Streaming Engine sposta l'esecuzione della pipeline dalle VM worker al backend del servizio Dataflow per una maggiore efficienza. Ti consigliamo di utilizzare Streaming Engine per i job di streaming.
Valuta la modalità at-least-once
Dataflow supporta due modalità per i job di flussi di dati: modalità exactly-once e modalità at-least-once. Se il tuo workload può tollerare record duplicati, la modalità at-least-once può ridurre notevolmente il costo del job. Prima di attivare la modalità at-least-once, valuta se la pipeline richiede l'elaborazione exactly-once dei record. Per saperne di più, consulta Imposta la modalità di flussi di dati della pipeline.
Scegli il modello di prezzi
Gli sconti per impegno di utilizzo (CUD) per i job di flussi di dati Dataflow offrono prezzi scontati in cambio dell'impegno a utilizzare continuamente una determinata quantità di risorse di computing di Dataflow per un anno o più. Gli sconti per impegno di utilizzo (CUD) di Dataflow sono utili quando la spesa per la capacità di computing di Dataflow per i job di flussi di dati prevede un minimo prevedibile che puoi impegnarti a sostenere per almeno un anno. Utilizzando i CUD, puoi potenzialmente ridurre il costo dei job Dataflow.
Valuta anche la possibilità di utilizzare la fatturazione basata sulle risorse. Con la fatturazione basata sulle risorse, le risorse di Streaming Engine utilizzate dal tuo job vengono misurate e conteggiate in unità di calcolo Streaming Engine. Ti vengono addebitati i costi per la CPU del worker, la memoria del worker e le unità di calcolo di Streaming Engine.
Regola le impostazioni di scalabilità automatica
Utilizza i suggerimenti per la scalabilità automatica e i livelli di latenza per ottimizzare le impostazioni di scalabilità automatica. Per saperne di più, consulta Ottimizza la scalabilità automatica orizzontale per le pipeline di streaming. Per i job di flussi di dati che utilizzano Streaming Engine, puoi aggiornare le impostazioni di ottimizzazione automatica senza interrompere o sostituire il job. Per saperne di più, consulta Aggiornamento delle opzioni dei job in corso.
Se ritieni che la tua pipeline non tragga vantaggio dalla scalabilità automatica, disattivala. Per saperne di più, consulta Scalabilità automatica orizzontale.
Se conosci il numero ottimale di thread per il job, imposta esplicitamente il numero di thread per worker utilizzando l'opzione della pipeline numberOfWorkerHarnessThreads o number_of_worker_harness_threads.
Interrompi i job a lunga esecuzione
Per i job di flussi di dati, Dataflow riprova a eseguire gli elementi di lavoro non riusciti a tempo indeterminato. Il job non è stato terminato. Tuttavia, il job potrebbe bloccarsi finché il problema non viene risolto. Crea policy di monitoraggio per rilevare segnali di una pipeline bloccata, come un aumento della latenza del sistema e una diminuzione della frequenza di aggiornamento dei dati. Implementa il logging degli errori nel codice della pipeline per identificare gli elementi di lavoro che non vanno a buon fine ripetutamente.
- Per monitorare gli errori della pipeline, consulta Conteggio log errori del worker.
- Per risolvere gli errori, consulta Risolvi gli errori di Dataflow.
Prestazioni della pipeline
Le pipeline che vengono eseguite più velocemente potrebbero costare meno. I seguenti fattori possono influire sulle prestazioni della pipeline:
- Il parallelismo disponibile per il tuo job
- L'efficienza delle trasformazioni, dei connettori I/O e dei codificatori utilizzati nella pipeline
- La posizione dei dati
Il primo passo per migliorare le prestazioni della pipeline è comprendere il modello di elaborazione:
- Scopri di più sul modello Apache Beam e sul modello di esecuzione Apache Beam.
- Scopri di più sul ciclo di vita della pipeline,
tra cui il modo in cui Dataflow gestisce la parallelizzazione e le
strategie di ottimizzazione che utilizza. I job Dataflow utilizzano più VM worker e ogni worker esegue più thread. I bundle di elementi di un
PCollectionvengono distribuiti a ogni thread di lavoro.
Segui queste best practice per la scrittura del codice della pipeline:
- Se possibile, utilizza l'ultima versione dell'SDK Apache Beam supportata. Segui le note di rilascio per comprendere le modifiche nelle diverse versioni.
- Segui le best practice per la scrittura del codice della pipeline.
- Segui le best practice per i connettori di I/O.
- Per le pipeline Python, valuta la possibilità di utilizzare container personalizzati. La pre-pacchettizzazione delle dipendenze riduce il tempo di avvio dei worker.
Logging
Segui queste best practice per il logging:
- Un logging eccessivo può influire negativamente sulle prestazioni.
- Per ridurre il volume dei log, valuta la possibilità di modificare il livello di log della pipeline. Per saperne di più, consulta Controlla il volume dei log.
- Non registrare singoli elementi. Attiva invece il campionamento dei dati.
- Utilizza un pattern di messaggi non recapitabili per gli errori per elemento, anziché registrare ogni errore.
Test
Il test della pipeline offre molti vantaggi, tra cui l'assistenza per gli upgrade dell'SDK, il refactoring della pipeline e le revisioni del codice. Molte ottimizzazioni, come la rielaborazione delle trasformazioni personalizzate ad alta intensità di CPU, possono essere testate localmente senza dover eseguire un job su Dataflow.
Testa le pipeline su larga scala con dati di test realistici per il tuo workload, tra cui il numero totale di elementi per le pipeline batch, il numero di elementi al secondo per le pipeline di streaming, la dimensione degli elementi e il numero di chiavi. Testa le tue pipeline in due modalità: in uno stato stabile e durante l'elaborazione di un backlog di grandi dimensioni per simulare un ripristino dopo un arresto anomalo.
Per saperne di più sulla creazione di test delle unità, test di integrazione e test end-to-end, consulta Testa la pipeline.
Per esempi di test, consulta il repository GitHub dataflow-ordered-processing.