Scalabilità dinamica dei thread

La scalabilità dinamica dei thread è una parte della suite di funzionalità di scalabilità verticale di Dataflow. Integra la funzionalità di scalabilità orizzontale di Dataflow regolando il numero di attività parallele, note anche come pacchetti, eseguite da ciascun worker Dataflow. L'obiettivo è aumentare l'efficienza complessiva della pipeline Dataflow.

Quando Dataflow esegue una pipeline, l'elaborazione viene distribuita su più macchine virtuali (VM) di Compute Engine, note anche come worker. Un thread è una singola attività eseguibile in esecuzione all'interno di un processo più grande. Dataflow avvia diversi thread su ogni worker.

Con la scalabilità dinamica dei thread abilitata, il servizio Dataflow sceglie automaticamente il numero appropriato di thread da eseguire su ciascun worker Dataflow. Poiché ogni thread esegue un'attività, l'aumento del numero di thread consente l'esecuzione in parallelo di più attività su un worker. Quando utilizzi questa funzionalità con la funzionalità di scalabilità automatica orizzontale, il numero totale di thread utilizzati dalla pipeline rimane invariato, ma vengono utilizzati meno worker.

La scalabilità dinamica dei thread utilizza un algoritmo per determinare il numero di thread necessari per ciascun worker in base agli indicatori di utilizzo delle risorse generati durante l'esecuzione della pipeline. Per ulteriori informazioni, consulta la sezione Come funziona in questa pagina.

Vantaggi

La scalabilità dinamica dei thread offre i seguenti potenziali vantaggi.

  • Consente ai worker Dataflow di elaborare i dati in modo più efficiente migliorando la CPU e l'utilizzo della memoria per ogni worker.
  • Migliora l'elaborazione parallela regolando il numero di thread worker disponibili per eseguire attività in parallelo durante l'esecuzione della pipeline.
  • Riduce il numero di worker necessari per elaborare set di dati di grandi dimensioni, il che potrebbe ridurre i tuoi costi.

Supporto e limitazioni

  • La scalabilità dinamica dei thread è disponibile per le pipeline che utilizzano gli SDK Java, Python e Go.
  • Il job Dataflow deve utilizzare Runner v2.
  • Sono supportate solo pipeline in modalità batch.
  • Le pipeline che richiedono molta CPU o memoria potrebbero non trarre vantaggio dalla scalabilità dinamica dei thread.
  • La scalabilità dinamica dei thread non riduce la quantità di tempo necessaria per il completamento di un job Dataflow.

Come funziona

La scalabilità dinamica dei thread utilizza i principi di ottimizzazione automatica per scalare dinamicamente il conteggio dei thread in alto o in basso su ciascun worker nel pool di worker Dataflow. Il numero di thread viene scalato in modo indipendente su ogni worker. Ogni thread esegue un'attività. L'aumento del numero di thread consente l'esecuzione in parallelo di più attività su un worker. Man mano che le attività vengono completate e i thread non sono più necessari, il conteggio dei thread viene ridotto. Un algoritmo determina il numero di thread di cui ha bisogno ogni worker.

Il numero di thread su un worker viene scalato fino a un massimo di due thread per vCPU quando sono soddisfatte entrambe le seguenti condizioni:

  • L'utilizzo della memoria sul worker è inferiore al 50%.
  • L'utilizzo della CPU sul worker è inferiore al 65%.

Il conteggio dei thread su un worker viene ridotto a un minimo di un thread per vCPU quando è soddisfatta la seguente condizione:

  • L'utilizzo della memoria sul worker è superiore al 70%.

Per visualizzare l'utilizzo della memoria e della CPU per il job, usa la scheda Metriche del job dell'interfaccia web di Dataflow.

Per garantire che i suggerimenti siano validi, Dataflow attende che l'utilizzo delle risorse si stabilizzi prima di inviare suggerimenti ai worker. Ad esempio, l'utilizzo di memoria e CPU potrebbe rientrare nell'intervallo di scalabilità, ma poiché l'utilizzo delle risorse è ancora in crescita, Dataflow non invia alcun suggerimento. Quando l'utilizzo delle risorse si stabilizza, Dataflow invia un suggerimento.

Se si verifica un errore di esaurimento della memoria, la scalabilità dei thread viene disabilitata automaticamente e la pipeline viene eseguita con un thread per vCPU.

Abilita scalabilità dinamica dei thread

Per abilitare la scalabilità dinamica dei thread, utilizza la seguente opzione di servizio Dataflow.

Java

--dataflowServiceOptions=enable_dynamic_thread_scaling

Python

--dataflow_service_options=enable_dynamic_thread_scaling

Go

--dataflow_service_options=enable_dynamic_thread_scaling

Quando la scalabilità dinamica dei thread è abilitata, puoi anche impostare il numero iniziale e massimo di worker disponibili per la pipeline durante l'esecuzione. Per scoprire di più, consulta la sezione Opzioni pipeline.

Verifica che la scalabilità dinamica dei thread sia abilitata

Quando la scalabilità dinamica dei thread è abilitata, nei file di log del worker viene visualizzato il seguente messaggio:

Enabling thread vertical scaling feature in worker.

Per visualizzare i file di log del worker, in Esplora log utilizza il riquadro Query per filtrare i log in base a Nome log. Utilizza il seguente nome di log nel filtro:

projects/PROJECT_ID/logs/dataflow.googleapis.com%2Fharness

Puoi vedere il numero consigliato di thread nei file di log dei worker. Il seguente messaggio include il numero consigliato di thread:

worker_thread_scaling_report_response { recommended_thread_count: NUMBER }

Se l'utilizzo delle risorse non è compreso nell'intervallo per la scalabilità, il valore visualizzato equivale al numero di vCPU sul worker.

Puoi anche utilizzare la console Google Cloud per verificare se la scalabilità dinamica dei thread è abilitata. Se è abilitato, nel riquadro Informazioni job di Dataflow, nella riga dataflowServiceOptions della sezione Opzioni pipeline, viene visualizzato enable_dynamic_thread_scaling.

Risoluzione dei problemi

Questa sezione fornisce istruzioni per la risoluzione dei problemi comuni relativi alla scalabilità dinamica dei thread.

Le prestazioni peggiorano con la scalabilità dinamica dei thread abilitata

L'aumento del numero di thread potrebbe causare problemi di prestazioni nei seguenti casi:

  • Quando più processi tentano di utilizzare la stessa risorsa, uno può utilizzare la risorsa, mentre gli altri devono attendere. Questa situazione è nota come contesa delle risorse. Quando si verifica un conflitto tra le risorse, le prestazioni della pipeline potrebbero peggiorare.
  • Quando si verificano errori di esaurimento della memoria, il ridimensionamento dinamico dei thread è disabilitato. In alcuni casi, gli errori di esaurimento della memoria potrebbero causare un errore della pipeline.

Verifica se il numero di thread è aumentato. Per informazioni su come verificare il numero di thread consigliato, consulta Verificare che il ridimensionamento dei thread sia abilitato in questa pagina.

Se il ridimensionamento dei thread è abilitato, per risolvere il problema, quando esegui la pipeline non includere l'opzione del servizio di scalabilità dinamica dei thread.

Worker unificato... abilitato e disabilitato

Dopo aver abilitato la scalabilità dinamica dei thread, il job potrebbe non riuscire e restituire il seguente errore:

The workflow could not be created. Causes: (ID): Unified worker misconfigured by user and was both enabled and disabled.

Questo errore si verifica quando Runner v2 viene disabilitato in modo esplicito.

Per risolvere il problema, abilitare Runner v2. Per ulteriori informazioni, consulta la sezione Abilitare Dataflow Runner v2 nella pagina "Usa Dataflow Runner V2".

Esegui l'upgrade dell'SDK

Dopo aver abilitato la scalabilità dinamica dei thread, il job potrebbe non riuscire e restituire il seguente errore:

Java

Dataflow Runner v2 requires the Apache Beam Java SDK version 2.29.0 or higher. Please upgrade your SDK and resubmit your job.

Python

Dataflow Runner v2 requires the Apache Beam SDK, version 2.21.0 or higher. Please upgrade your SDK and resubmit your job.

Questo errore si verifica quando non è possibile abilitare Runner v2 perché la versione dell'SDK non lo supporta.

Per risolvere il problema, utilizza una versione dell'SDK che supporti Runner v2.

Impossibile abilitare la funzionalità di scalabilità verticale del thread

Dopo aver abilitato la scalabilità dinamica dei thread, il job potrebbe non riuscire e restituire il seguente errore:

The workflow could not be created. Causes: (ID): Thread vertical scaling feature can not be enabled while number_of_worker_harness_threads is specified.

Questo errore si verifica quando la pipeline imposta esplicitamente il numero di thread per worker utilizzando l'opzione pipeline numberOfWorkerHarnessThreads o number_of_worker_harness_threads.

Per risolvere il problema, rimuovi l'opzione pipeline numberOfWorkerHarnessThreads o number_of_worker_harness_threads dalla pipeline.