Secondo un recente rapporto di IBM Marketing cloud, “il 90% dei dati nel mondo di oggi è stato creato solo negli ultimi due anni, creando 2. 5 quintilioni di byte di dati ogni giorno – e con l’emergere di nuovi dispositivi, sensori e tecnologie, è probabile che la crescita dei dati acceleri ulteriormente”.5 quintilioni di byte di dati ogni giorno – e con l’emergere di nuovi dispositivi, sensori e tecnologie, il tasso di crescita dei dati probabilmente accelererà ancora di più”.
Tecnicamente questo significa che il nostro mondo del Big Data Processing sarà più complesso e più impegnativo. E molti casi d’uso (ad esempio gli annunci delle app mobili, il rilevamento delle frodi, la prenotazione di taxi, il monitoraggio dei pazienti, ecc) hanno bisogno di un’elaborazione dei dati in tempo reale, come e quando i dati arrivano, per prendere decisioni rapide. Questo è il motivo per cui il Distributed Stream Processing è diventato molto popolare nel mondo dei Big Data.
Oggi ci sono un certo numero di framework di streaming open source disponibili. È interessante notare che quasi tutti sono abbastanza nuovi e sono stati sviluppati solo negli ultimi anni. Quindi è abbastanza facile per una persona nuova confondersi nella comprensione e nella differenziazione tra i framework di streaming. In questo post parlerò prima dei tipi e degli aspetti dello Stream Processing in generale e poi confronterò i più popolari framework di Streaming open source: Flink, Spark Streaming, Storm, Kafka Streams. Cercherò di spiegare come funzionano (brevemente), i loro casi d’uso, i punti di forza, le limitazioni, le somiglianze e le differenze.
Che cos’è lo Streaming/Stream Processing :
La definizione più elegante che ho trovato è: un tipo di motore di elaborazione dei dati che è progettato con set di dati infiniti in mente. Niente di più.
A differenza dell’elaborazione Batch dove i dati sono delimitati con un inizio e una fine in un lavoro e il lavoro finisce dopo l’elaborazione di quei dati finiti, lo Streaming è pensato per l’elaborazione di dati illimitati che arrivano in tempo reale continuamente per giorni, mesi, anni e per sempre. Come tale, essendo sempre pensato per essere attivo e funzionante, un’applicazione di streaming è difficile da implementare e più difficile da mantenere.
Aspetti importanti dell’elaborazione degli stream:
Ci sono alcune importanti caratteristiche e termini associati all’elaborazione degli stream che dovremmo conoscere per capire i punti di forza e i limiti di qualsiasi framework di streaming :
- Garanzie di consegna :
Significa qual è la garanzia che non importa cosa, un particolare record in entrata in un motore di streaming sarà elaborato. Può essere Atleast-once (sarà processato almeno una volta anche in caso di errori), Atmost-once (potrebbe non essere processato in caso di errori) o Exactly-once (sarà processato una ed esattamente una volta anche in caso di errori). Ovviamente Exactly-once è desiderabile, ma è difficile da raggiungere nei sistemi distribuiti e viene a compromessi con le prestazioni. - Fault Tolerance :
In caso di guasti come guasti dei nodi, guasti di rete, ecc, il framework dovrebbe essere in grado di recuperare e dovrebbe ricominciare l’elaborazione dal punto in cui è partito. Questo si ottiene attraverso il checkpointing dello stato dello streaming in qualche memoria persistente di volta in volta. es. checkpointing kafka offsets a zookeeper dopo aver ottenuto un record da Kafka e averlo elaborato. - Gestione dello stato :
In caso di requisiti di elaborazione statica in cui abbiamo bisogno di mantenere un certo stato (es.Ad esempio il conteggio di ogni parola distinta vista nei record), il framework dovrebbe essere in grado di fornire qualche meccanismo per preservare e aggiornare le informazioni di stato. - Performance :
Questo include la latenza (quanto velocemente un record può essere elaborato), il throughput (record elaborati/secondo) e la scalabilità. La latenza dovrebbe essere la minima possibile mentre il throughput dovrebbe essere il più possibile. È difficile ottenere entrambi allo stesso tempo. - Caratteristiche avanzate: Event Time Processing, Watermark, Windowing
Queste sono caratteristiche necessarie se i requisiti di elaborazione del flusso sono complessi. Per esempio, l’elaborazione dei record in base al tempo in cui è stato generato alla fonte (elaborazione del tempo dell’evento). Per saperne di più in dettaglio, leggi questi post imperdibili di Tyler Akidau di Google: parte1 e parte2. - Maturità :
Importante dal punto di vista dell’adozione, è bello se il framework è già provato e testato in scala da grandi aziende. È più probabile ottenere un buon supporto della comunità e aiuto su stackoverflow.
Due tipi di elaborazione di flussi:
Ora che siamo consapevoli dei termini che abbiamo appena discusso, è facile capire che ci sono 2 approcci per implementare un framework di streaming:
Streaming nativo :
Conosciuto anche come Streaming nativo. Significa che ogni record in arrivo viene elaborato non appena arriva, senza aspettare gli altri. Ci sono alcuni processi in esecuzione continua (che chiamiamo operatori/task/bulloni a seconda del framework) che vengono eseguiti per sempre e ogni record passa attraverso questi processi per essere elaborato. Esempi: Storm, Flink, Kafka Streams, Samza.
Micro-batching :
Anche noto come Fast Batching. Significa che i record in arrivo ogni pochi secondi sono raggruppati e poi processati in un unico mini-batch con un ritardo di pochi secondi. Esempi: Spark Streaming, Storm-Trident.
Entrambi gli approcci hanno alcuni vantaggi e svantaggi.
Lo Streaming nativo sembra naturale in quanto ogni record viene elaborato non appena arriva, permettendo al framework di raggiungere la minima latenza possibile. Ma significa anche che è difficile raggiungere la tolleranza d’errore senza compromettere il throughput, poiché per ogni record, abbiamo bisogno di tracciare e fare il checkpoint una volta elaborato. Inoltre, la gestione dello stato è facile perché ci sono processi a lungo termine che possono mantenere lo stato richiesto facilmente.
Micro-batching , d’altra parte, è abbastanza opposto. La tolleranza ai guasti è gratuita in quanto è essenzialmente un batch e il throughput è anche elevato in quanto l’elaborazione e il checkpointing saranno fatti in un colpo solo per un gruppo di record. Ma sarà al costo di una certa latenza e non si sentirà come uno streaming naturale. Anche la gestione efficiente dello stato sarà una sfida da mantenere.
Streaming Frameworks One By One:
Storm :
Storm è il hadoop del mondo dello streaming. È il più vecchio framework di streaming open source e uno dei più maturi e affidabili. È un vero streaming ed è buono per semplici casi d’uso basati su eventi. Ho condiviso i dettagli su Storm a lungo in questi post: parte1 e parte2.
Svantaggi:
- Latenza molto bassa, vero streaming, maturo ed elevato throughput
- Eccellente per casi d’uso di streaming non complicati
Svantaggi
- Nessuna gestione dello stato
- No funzioni avanzate come l’elaborazione del tempo degli eventi, aggregazione, windowing, sessioni, watermark, ecc
- Garanziatleast-once
Spark Streaming :
Spark è emerso come vero successore di Hadoop nell’elaborazione Batch e il primo framework a supportare completamente l’architettura Lambda (dove sono implementati sia Batch che Streaming; Batch per la correttezza, Streaming per la velocità). È immensamente popolare, maturato e ampiamente adottato. Spark Streaming viene fornito gratuitamente con Spark e utilizza il micro batching per lo streaming. Prima della versione 2.0, Spark Streaming aveva alcune serie limitazioni di prestazioni, ma con la nuova versione 2.0+, è chiamato streaming strutturato ed è dotato di molte buone caratteristiche come la gestione della memoria personalizzata (come Flink) chiamata tungsten, watermark, supporto all’elaborazione degli eventi, ecc. Anche lo Structured Streaming è molto più astratto e nella versione 2.3.0 c’è la possibilità di passare dalla modalità micro-batching a quella streaming continuo. La modalità di streaming continuo promette di dare una sub latenza come Storm e Flink, ma è ancora in una fase iniziale con molte limitazioni nelle operazioni.
Avantaggi:
- Supporta l’architettura Lambda, viene fornito gratuitamente con Spark
- Alto throughput, buono per molti casi d’uso in cui la sub-latenza non è richiesta
- Tolleranza ai guasti per impostazione predefinita a causa della natura micro-batch
- Semplice per usare API di livello superiore
- Grande comunità e miglioramenti aggressivi
- Esattamente una volta
Svantaggi
- Non vero streaming, non adatto a requisiti di bassa latenza
- Troppi parametri da regolare. Difficile da mettere a punto. Ho scritto un post sulla mia esperienza personale durante la messa a punto di Spark Streaming
- Stateless per natura
- Lascia indietro Flink in molte caratteristiche avanzate
Flink :
Flink ha anche un background accademico simile a Spark. Mentre Spark viene da UC Berkley, Flink viene dall’Università TU di Berlino. Come Spark supporta anche l’architettura Lambda. Ma l’implementazione è abbastanza opposta a quella di Spark. Mentre Spark è essenzialmente un batch con Spark streaming come micro-batching e caso speciale di Spark Batch, Flink è essenzialmente un vero motore di streaming che tratta il batch come caso speciale di streaming con dati limitati. Anche se le API in entrambi i framework sono simili, ma non hanno alcuna somiglianza nelle implementazioni. In Flink, ogni funzione come map, filter, reduce, ecc è implementata come operatore di lunga durata (simile a Bolt in Storm)
Flink sembra un vero successore di Storm come Spark è riuscito a hadoop in batch.
Avantaggi:
- Leader dell’innovazione nel panorama dello streaming open source
- Primo vero framework di streaming con tutte le caratteristiche avanzate come l’elaborazione temporale degli eventi, watermark, ecc
- Bassa latenza con alto throughput, configurabile secondo i requisiti
- Auto-regolazione, non troppi parametri da sintonizzare
- Esattamente una volta
- Vendendo ampiamente accettato da grandi aziende in scala come Uber, Alibaba.
Svantaggi
- Poco più tardi nel gioco, c’è stata una mancanza di adozione inizialmente
- La comunità non è grande come Spark ma cresce a ritmo veloce ora
- Nessuna adozione nota del Flink Batch per ora, solo popolare per lo streaming.
Kafka Streams :
Kafka Streams , a differenza di altri framework di streaming, è una libreria leggera. E’ utile per lo streaming dei dati da Kafka, per fare trasformazioni e poi rispedirli a Kafka. Possiamo intenderla come una libreria simile a Java Executor Service Thread pool, ma con il supporto integrato per Kafka. Può essere integrato bene con qualsiasi applicazione e funzionerà out of the box.
A causa della sua natura leggera, può essere utilizzato in architetture di tipo microservices. Non c’è partita in termini di prestazioni con Flink, ma non ha anche bisogno di un cluster separato per funzionare, è molto pratico e facile da distribuire e iniziare a lavorare. Internamente utilizza il gruppo Kafka Consumer e lavora sulla filosofia dei log Kafka.
Questo post spiega accuratamente i casi d’uso di Kafka Streams vs Flink Streaming.
Un grande vantaggio di Kafka Streams è che la sua elaborazione è Esattamente una volta end to end. È possibile perché la fonte e la destinazione sono entrambe Kafka e dalla versione Kafka 0.11 rilasciata intorno a giugno 2017, Exactly once è supportata. Per abilitare questa funzione, abbiamo solo bisogno di abilitare una bandiera e funzionerà fuori dalla scatola. Per ulteriori dettagli condivisi qui e qui.
Svantaggi:
- Leggera libreria, buona per microservizi, applicazioni IOT
- Non ha bisogno di cluster dedicati
- Eredita tutte le buone caratteristiche di Kafka
- Supporta gli Stream join, internamente usa rocksDb per mantenere lo stato.
- Exactly Once ( Kafka 0.11 in poi).
Svantaggi
- Strettamente accoppiato con Kafka, non può usare senza Kafka nella foto
- Quasi nuovo in fase iniziale, ancora da testare in grandi aziende
- Non per lavori pesanti come Spark Streaming, Flink.
Samza :
Copriremo Samza in breve. Samza da 100 piedi sembra simile a Kafka Streams nell’approccio. Ci sono molte somiglianze. Entrambi questi framework sono stati sviluppati dagli stessi sviluppatori che hanno implementato Samza presso LinkedIn e poi fondato Confluent dove hanno scritto Kafka Streams. Entrambe queste tecnologie sono strettamente accoppiate con Kafka, prendono i dati grezzi da Kafka e poi rimettono i dati elaborati a Kafka. Usano la stessa filosofia di Kafka Log. Samza è una sorta di versione scalata di Kafka Streams. Mentre Kafka Streams è una libreria destinata ai microservizi, Samza è un’elaborazione cluster completa che gira su Yarn.
Svantaggi :
- Molto buono nel mantenere grandi stati di informazioni (buono per il caso di utilizzo di unire i flussi) usando rocksDb e kafka log.
- Tollerante ai guasti e performante usando le proprietà di Kafka
- Una delle opzioni da considerare se si usa già Yarn e Kafka nella pipeline di elaborazione.
- Buon cittadino di Yarn
- Bassa latenza, alto rendimento, maturo e testato su scala
Svantaggi :
- Si accoppia strettamente con Kafka e Yarn. Non è facile da usare se uno di questi non è nella tua pipeline di elaborazione.
- Garanzia di elaborazionetleast-Once. Non sono sicuro se ora supporta esattamente una volta come Kafka Streams dopo Kafka 0.11
- Mancanza di caratteristiche avanzate di streaming come Watermark, Sessioni, trigger, ecc
Confronto dei Framework di Streaming:
Possiamo confrontare tecnologie solo con offerte simili. Mentre Storm, Kafka Streams e Samza sembrano ora utili per casi d’uso più semplici, la vera competizione è chiara tra i pesi massimi con le ultime caratteristiche: Spark vs Flink