I carichi di lavoro altamente paralleli, noti anche come carichi di lavoro imbarazzabilmente paralleli, sono comuni nelle imprese finanziarie, dei media e delle scienze biologiche. Per carichi di lavoro paralleli come questi, le aziende solitamente eseguono il deployment di un cluster di nodi di calcolo. Ogni nodo può eseguire attività di elaborazione indipendenti, in una configurazione denominata grid computing. Per elaborare i dati per carichi di lavoro paralleli, puoi utilizzare Apache Beam con Dataflow. Per ulteriori informazioni su Apache Beam, consulta la guida alla programmazione Apache Beam.
L'utilizzo di Dataflow per carichi di lavoro altamente paralleli offre molti vantaggi.
- Crea un flusso di lavoro completamente gestito, con elaborazione e orchestrazione dei dati nella stessa pipeline.
- L'interfaccia utente e l'API Dataflow includono funzionalità di osservabilità.
- Dataflow dispone di un logging centralizzato per tutte le fasi della pipeline.
- Dataflow offre la scalabilità automatica per massimizzare le prestazioni e ottimizzare l'utilizzo delle risorse.
- Dataflow è tollerante ai guasti e fornisce un bilanciamento del carico dinamico.
- Dataflow offre rilevamento e correzione degli elementi in ritardo.
- Utilizza un unico sistema per tutti gli aspetti della pipeline, sia per la pre-elaborazione e la post-elaborazione sia per l'elaborazione delle attività. Puoi anche utilizzare il tuo codice C++ esistente nella pipeline.
- Utilizza l'elaborazione "exactly-once" integrata fornita da Dataflow.
Inoltre, Dataflow include varie funzionalità di sicurezza:
- Utilizza una chiave di crittografia gestita dal cliente (CMEK) con la tua pipeline.
- Definisci le regole firewall per la rete associata al job Dataflow.
- Utilizza una rete VPC.
Questi carichi di lavoro richiedono la distribuzione dei dati a funzioni eseguite su molti core. Questa distribuzione spesso richiede letture di contemporaneità molto elevate seguite da un grande fan-out di dati, assorbita dai sistemi downstream. Le competenze principali di Dataflow sono la distribuzione di carichi di lavoro in modalità flusso e batch tra le risorse e la gestione della scalabilità automatica e del ribilanciamento dinamico del lavoro tra queste risorse. Di conseguenza, quando utilizzi Dataflow per i tuoi carichi di lavoro a elevata parallelismo, le esigenze di prestazioni, scalabilità, disponibilità e sicurezza vengono gestite automaticamente.
Incorporare il codice esterno nella pipeline
Al momento Apache Beam dispone di SDK integrati per Java, Python e Go. Tuttavia, molti carichi di lavoro altamente paralleli utilizzano codice scritto in C++. Puoi utilizzare Dataflow e altri servizi Google Cloud per eseguire programmi binari (librerie) C++ come codice esterno utilizzando Apache Beam. L'inclusione di programmi binari C++ consente di sbloccare questi tipi di carichi di lavoro utilizzando servizi completamente gestiti. Consente inoltre di creare pipeline complete utilizzando un sofisticato grafico aciclico diretto (DAG).
Lo stesso approccio per l'esecuzione di programmi binari in C++ è pertinente anche per il codice scritto in altri linguaggi, in cui è possibile compilare un programma binario autonomo.
Pipeline end-to-end altamente parallele
Con Dataflow puoi eseguire l'elaborazione in lettura/scrittura, l'analisi e l'output delle attività di I/O nella stessa pipeline, il che ti consente di eseguire pipeline complete altamente parallele
Ad esempio, un carico di lavoro HPC a elevata parallelismo potrebbe incorporare i seguenti passaggi:
Importa dati non elaborati, sia da origini interne che da origini esterne. I dati possono provenire da origini illimitate o limitate. Le origini illimitate vengono per lo più convertite in origini limitate per supportare le tecnologie utilizzate per il task farming.
Pre-elabora i dati non elaborati in un formato dati e codifica che può essere utilizzato dal componente di attività farming.
Utilizza un sistema per distribuire i calcoli agli host e per recuperare i dati da un'origine, quindi materializzare i risultati per la post-analisi.
Eseguire una post-analisi per convertire i risultati in output.
Puoi utilizzare Dataflow per gestire tutti questi passaggi in un'unica pipeline, sfruttando al contempo i vantaggi delle funzionalità di Dataflow:
Poiché un singolo sistema è responsabile di tutte le fasi, non è necessario un sistema di orchestrazione esterno per coordinare l'esecuzione di più pipeline.
Con la località dei dati, non è necessario materializzare e dematerializzare esplicitamente tra i confini della fase per aumentare l'efficienza.
Con una migliore telemetria nel sistema, sono disponibili informazioni sui byte totali nello stage, il che aiuta a progettare le fasi successive.
Con la scalabilità automatica, quando i dati sono nel sistema, le risorse vengono scalate in base ai volumi di dati mentre i dati si spostano nelle fasi della pipeline.
La pipeline HPC a elevata parallelismo di Dataflow utilizza moderni motori di esecuzione DAG. Tutti i processi tipici della pipeline possono essere completati in un singolo DAG e, di conseguenza, in una singola pipeline Dataflow. Puoi usare un DAG generato da Apache Beam per definire la forma della pipeline.
Se stai passando da un sistema di task farm a un flusso di lavoro altamente parallelo, devi passare dalle attività ai dati. Un PTransform
contiene un
DoFn
,
che ha una funzione di elaborazione che acquisisce un elemento di dati.
Il punto dati può essere qualsiasi oggetto con una o più proprietà.
L'utilizzo di un DAG e di una pipeline singola consente di caricare tutti i dati all'interno del sistema durante l'intero flusso di lavoro. Non è necessario eseguire l'output dei dati nei database o nello spazio di archiviazione.
Componenti di Google Cloud utilizzati con flussi di lavoro altamente paralleli
Le applicazioni di grid computing richiedono la distribuzione dei dati a funzioni eseguite su molti core. Questo pattern richiede spesso letture a elevata contemporaneità ed è spesso seguito da un grande fan-out dei dati assorbiti dai sistemi downstream.
Dataflow è integrato con altri servizi gestiti di Google Cloud in grado di assorbire l'I/O di dati parallelizzati su larga scala:
- Pub/Sub: spazio di archiviazione a colonne larghe per la memorizzazione nella cache e la gestione
- Bigtable: servizio globale di importazione dei flussi di eventi
- Cloud Storage: archivio di oggetti unificato
- BigQuery: servizio di data warehouse su scala petabyte
Questi servizi, se utilizzati insieme, forniscono una soluzione efficace per carichi di lavoro altamente paralleli.
L'architettura comune per i carichi di lavoro altamente paralleli in esecuzione su Google Cloud include:
Dataflow Runner per Apache Beam. Questo runner distribuisce il lavoro ai nodi della griglia con un flusso di elaborazione derivato da un DAG. Un singolo DAG Apache Beam consente di definire pipeline multifase complesse in cui è possibile riunire le fasi con pipeline parallele utilizzando input lato o join.
Cloud Storage. Questo servizio fornisce una posizione per l'archiviazione dei file binari di C++. Quando è necessario archiviare file di grandi dimensioni, come in molti casi d'uso multimediali, questi file risiedono anche in Cloud Storage.
Bigtable, BigQuery e Pub/Sub. Questi servizi vengono utilizzati sia come origini che come sink.
Il seguente diagramma illustra l'architettura di alto livello per un flusso di lavoro di esempio.
Puoi anche utilizzare altri sistemi di archiviazione. Per maggiori dettagli, consulta l'elenco dei sistemi di archiviazione e delle origini di flusso nella pagina I/O della pipeline nella documentazione di Apache Beam.
L'esecutore di Dataflow per Apache Beam
Utilizza Dataflow per trasformare e arricchire i dati in modalità flusso e batch. Dataflow è basato su Apache Beam.
Cloud Storage
Cloud Storage è uno spazio di archiviazione di oggetti unificato che include pubblicazione di dati in tempo reale, analisi dei dati, machine learning (ML) e archiviazione dei dati. Per carichi di lavoro altamente paralleli con Dataflow, Cloud Storage fornisce accesso ai programmi binari di C++. In alcuni casi d'uso, Cloud Storage fornisce anche la località dei dati richiesti dalla fase di elaborazione.
Per i carichi a burst elevati richiesti dal grid computing, è necessario comprendere le caratteristiche delle prestazioni di Cloud Storage. Per ulteriori informazioni sulle prestazioni della gestione dei dati di Cloud Storage, consulta le linee guida per tasso di richieste e distribuzione degli accessi nella documentazione di Cloud Storage.
Bigtable
Bigtable è un servizio di database NoSQL ad alte prestazioni ottimizzato per carichi di lavoro analitici e operativi di grandi dimensioni. Bigtable è complementare a Dataflow. Le caratteristiche principali di Bigtable, letture e scritture a bassa latenza (6 ms al 90° percentile), gli consentono di gestire molte migliaia di client simultanei e carichi di lavoro intensivi. Queste funzionalità rendono Bigtable ideale come sink e come origine dati all'interno della funzione DoFn
nella fase di elaborazione di Dataflow.
BigQuery
BigQuery è un data warehouse aziendale veloce, economico e completamente gestito per l'analisi di dati su larga scala. I risultati della griglia vengono spesso utilizzati per l'analisi e consentono di eseguire aggregazioni su larga scala sull'output di dati della griglia.
Pub/Sub
Pub/Sub è un servizio di messaggistica asincrono e scalabile che disaccoppia i servizi che producono messaggi dai servizi che elaborano questi messaggi. Puoi utilizzare Pub/Sub per l'analisi dei flussi di dati e le pipeline di integrazione dei dati per importare e distribuire i dati. È efficace anche come middleware orientato ai messaggi per l'integrazione dei servizi o come coda per parallelizzare le attività.
Il DAG Dataflow
L'SDK Apache Beam consente di creare DAG espressivi, che a loro volta consentono di
creare pipeline in più fasi in modalità flusso o batch. Lo spostamento dei dati viene gestito dal runner, con dati espressi come oggetti PCollection
, che sono raccolte di elementi paralleli immutabili.
Il seguente diagramma illustra questo flusso.
L'SDK Apache Beam consente di definire un DAG. Nel DAG puoi includere il codice definito dall'utente come funzioni. Normalmente, viene utilizzato lo stesso linguaggio di programmazione (Java, Python o Go) sia per la dichiarazione del DAG sia per il codice definito dall'utente. Puoi anche utilizzare codice non integrato, come C++, per il codice definito dall'utente.
Passaggi successivi
Scopri le best practice per lavorare con le pipeline HPC di Dataflow altamente parallele.
Segui il tutorial per creare una pipeline che utilizza container personalizzati con librerie C++.