I PCollections illimitati, o raccolte illimitate, rappresentano i dati nelle pipeline di streaming. Una raccolta illimitata contiene dati provenienti da un'origine dati in continuo aggiornamento, come Pub/Sub.
Non puoi utilizzare solo una chiave per raggruppare gli elementi in una raccolta illimitata. Potrebbe esserci un numero infinito di elementi per una determinata chiave nei dati di streaming, perché l'origine dati aggiunge costantemente nuovi elementi. Puoi utilizzare finestre, filigrane, e trigger per aggregare gli elementi nelle raccolte illimitate.
Il concetto di finestre si applica anche ai PCollection limitati che rappresentano i dati nelle pipeline in batch. Per informazioni sulle finestre nelle pipeline in batch, consulta la documentazione di Apache Beam relativa a Finestre con PCollection limitati.
Se una pipeline Dataflow ha un'origine dati limitata, ovvero un'origine che non contiene dati in continuo aggiornamento, e la pipeline viene passata alla modalità di streaming utilizzando il flag --streaming, quando l'origine limitata viene consumata completamente, la pipeline smette di essere eseguita.
Utilizzare la modalità di streaming
Per eseguire una pipeline in modalità di streaming, imposta il flag --streaming nella
riga di comando
quando esegui la pipeline. Puoi anche impostare la modalità di streaming
a livello di programmazione
quando crei la pipeline.
Le origini in batch non sono supportate in modalità di streaming.
Quando aggiorni la pipeline con un pool di worker più grande, il job di streaming potrebbe non eseguire l'upscaling come previsto. Per i job di streaming che non utilizzano Streaming Engine, non puoi scalare oltre il numero originale di worker e le risorse di Persistent Disk allocate all'inizio del job originale. Quando aggiorni un job Dataflow e specifichi un numero maggiore di worker nel nuovo job, puoi specificare solo un numero di worker uguale al numero massimo di worker specificato per il job originale.
Specifica il numero massimo di worker utilizzando i seguenti flag:
Java
--maxNumWorkers
Python
--max_num_workers
Vai
--max_num_workers
Finestre e funzioni di finestratura
Le funzioni di finestratura dividono le raccolte illimitate in componenti logici, o finestre. Le funzioni di finestratura raggruppano le raccolte illimitate in base ai timestamp dei singoli elementi. Ogni finestra contiene un numero finito di elementi.
Imposta le seguenti finestre con l'SDK Apache Beam:
- Finestre a cascata (chiamate finestre fisse in Apache Beam)
- Finestre di hopping (chiamate finestre scorrevoli in Apache Beam)
- Finestre di sessione
Finestre a cascata
Una finestra a cascata rappresenta un intervallo di tempo coerente e disgiunto nel flusso di dati.
Ad esempio, se imposti una finestra a cascata di 30 secondi, gli elementi con valori di timestamp [0:00:00-0:00:30) si trovano nella prima finestra. Gli elementi con valori di timestamp [0:00:30-0:01:00) si trovano nella seconda finestra.
L'immagine seguente illustra come gli elementi vengono suddivisi in finestre a cascata di 30 secondi.

Finestre di hopping
Una finestra di hopping rappresenta un intervallo di tempo coerente nello stream di dati. Le finestre di hopping possono sovrapporsi, mentre le finestre a cascata sono disgiunte.
Ad esempio, una finestra di hopping può iniziare ogni 30 secondi e acquisire un minuto di dati. La frequenza con cui iniziano le finestre di hopping è chiamata periodo. Questo esempio ha una finestra di un minuto e un periodo di 30 secondi.
L'immagine seguente illustra come gli elementi vengono suddivisi in finestre di hopping di un minuto con un periodo di 30 secondi.

Per calcolare le medie correnti dei dati, utilizza le finestre di hopping. Puoi utilizzare finestre di hopping di un minuto con un periodo di 30 secondi per calcolare una media corrente di un minuto ogni 30 secondi.
Finestre di sessione
Una finestra di sessione contiene elementi all'interno di una durata di intervallo di un altro elemento. La durata dell'intervallo è un intervallo tra i nuovi dati in uno stream di dati. Se i dati arrivano dopo la durata dell'intervallo, vengono assegnati a una nuova finestra.
Ad esempio, le finestre di sessione possono dividere uno stream di dati che rappresenta l'attività del mouse dell'utente. Questo stream di dati potrebbe avere lunghi periodi di inattività intervallati da molti clic. Una finestra di sessione può contenere i dati generati dai clic.
La finestratura di sessione assegna finestre diverse a ogni chiave di dati. Le finestre a cascata e di hopping contengono tutti gli elementi nell'intervallo di tempo specificato, indipendentemente dalle chiavi di dati.
L'immagine seguente visualizza come gli elementi vengono suddivisi in finestre di sessione.

Filigrane
Una filigrana è una soglia che indica quando Dataflow prevede che siano arrivati tutti i dati in una finestra. Se la filigrana ha superato la fine della finestra e arrivano nuovi dati con un timestamp all'interno della finestra, i dati vengono considerati dati in ritardo. Per ulteriori informazioni, consulta la sezione Filigrane e dati in ritardo nella documentazione di Apache Beam.
Dataflow tiene traccia delle filigrane per i seguenti motivi:
- Non è garantito che i dati arrivino in ordine di tempo o a intervalli prevedibili.
- Non è garantito che gli eventi di dati vengano visualizzati nelle pipeline nello stesso ordine in cui sono stati generati.
L'origine dati determina la filigrana. Puoi consentire i dati in ritardo con l'SDK Apache Beam.
Trigger
I trigger determinano quando emettere i risultati aggregati all'arrivo dei dati. Per impostazione predefinita, i risultati vengono emessi quando la filigrana supera la fine della finestra.
Puoi utilizzare l'SDK Apache Beam per creare o modificare i trigger per ogni raccolta in una pipeline di streaming.
L'SDK Apache Beam può impostare trigger che operano su qualsiasi combinazione delle seguenti condizioni:
- Ora dell'evento, come indicato dal timestamp su ogni elemento di dati.
- Tempo di elaborazione, ovvero il tempo in cui l'elemento di dati viene elaborato in una determinata fase della pipeline.
- Il numero di elementi di dati in una raccolta.