Se si guarda questa immagine con una lista di strumenti di big data, può sembrare che tutte le possibili nicchie in questo campo siano già occupate. Con così tanta concorrenza, dovrebbe essere molto difficile trovare una tecnologia innovativa.
I creatori di Apache Flink hanno un pensiero diverso su questo. È iniziato come un progetto di ricerca chiamato Stratosphere. Stratosphere è stato biforcato, e questo fork è diventato quello che conosciamo come Apache Flink. Nel 2014, è stato accettato come progetto Apache Incubator, e solo pochi mesi dopo, è diventato un progetto Apache di primo livello. Al momento in cui scriviamo, il progetto ha quasi dodicimila commit e più di 300 collaboratori.
Perché c’è così tanta attenzione? Questo perché Apache Flink è stato definito un framework di nuova generazione per l’elaborazione dei big data e ha abbastanza innovazioni sotto la cintura per sostituire Apache Spark e diventare il nuovo strumento de-facto per l’elaborazione batch e in flusso.
Si dovrebbe passare ad Apache Flink? Dovresti rimanere con Apache Spark per un po’? O Apache Flink è solo una nuova trovata? Questo articolo cercherà di darvi risposte a queste e altre domande.
A meno che non abbiate vissuto sotto una roccia negli ultimi due anni, avete sentito parlare di Apache Spark. Sembra che ogni sistema moderno che fa qualsiasi tipo di elaborazione dei dati stia usando Apache Spark in un modo o nell’altro.
Per molto tempo, Spark è stato l’ultimo e più grande strumento in questo settore. Ha fornito alcune caratteristiche impressionanti rispetto ai suoi predecessori come:
- Velocità impressionante: è dieci volte più veloce di Hadoop se i dati vengono elaborati su un disco e fino a 100 volte più veloce se i dati vengono elaborati in memoria.
- Modello di grafo aciclico diretto più semplice: Invece di definire i tuoi lavori di elaborazione dei dati usando un rigido framework MapReduce, Spark permette di definire un grafo di compiti che possono implementare complessi algoritmi di elaborazione dei dati
- Elaborazione di flussi: Con l’avvento di nuove tecnologie come l’Internet delle cose, non è sufficiente semplicemente elaborare un’enorme quantità di dati. Ora, abbiamo bisogno di elaborare un’enorme quantità di dati mentre arrivano in tempo reale. Questo è il motivo per cui Apache Spark ha introdotto l’elaborazione del flusso che permette di elaborare un flusso potenzialmente infinito di dati.
- Ricco set di librerie: Oltre alle sue caratteristiche principali, Apache Spark fornisce potenti librerie per l’apprendimento automatico, l’elaborazione di grafici e l’esecuzione di query SQL.
Per avere un’idea migliore di come si scrivono le applicazioni con Apache Spark, diamo un’occhiata a come si può implementare una semplice applicazione di conteggio delle parole che dovrebbe contare quante volte ogni parola è stata utilizzata in un documento di testo:
// Read fileval file = sc.textFile("file/path")val wordCount = file // Extract words from every line .flatMap(line => line.split(" ")) // Convert words to pairs .map(word => (word, 1)) // Count how many times each word was used .reduceByKey(_ + _)
Se si conosce Scala, questo codice dovrebbe sembrare semplice ed è simile al lavoro con collezioni regolari. Per prima cosa, leggiamo una lista di righe da un file situato in file/path”. Questo file può essere sia un file locale che un file in HDFS o S3.
Poi, ogni riga viene divisa in una lista di parole usando il metodo flatMap
che semplicemente divide una stringa con il simbolo dello spazio. Poi, per implementare il conteggio delle parole, usiamo il metodo map
per convertire ogni parola in una coppia dove il primo elemento della coppia è una parola del testo di input e il secondo elemento è semplicemente un numero uno.
L’ultimo passo conta semplicemente quante volte ogni parola è stata usata sommando i numeri di tutte le coppie per la stessa parola.
Apache Spark sembra uno strumento grande e versatile. Ma cosa porta Apache Flink al tavolo?
A prima vista, non sembrano esserci molte differenze. Il diagramma dell’architettura sembra molto simile:
Se si dà un’occhiata all’esempio di codice per l’applicazione di conteggio delle parole per Apache Flink, si vedrebbe che non c’è quasi nessuna differenza:
val file = env.readTextFile("file/path")val counts = file .flatMap(line => line.split(" ")) .map(word => (word, 1)) .groupBy(0) .sum(1)
Poche differenze notevoli, è che in questo caso dobbiamo usare il metodo readTextFile
invece del metodo textFile
e che dobbiamo usare una coppia di metodi: groupBy
e sum
invece di reduceByKey
.
Così che cosa è tutto questo trambusto? Apache Flink può non avere alcuna differenza visibile all’esterno, ma ha sicuramente abbastanza innovazioni, per diventare lo strumento di elaborazione dati di prossima generazione. Eccone solo alcune:
- Implementa l’effettiva elaborazione dello streaming: Quando si elabora un flusso in Apache Spark, lo tratta come tanti piccoli problemi di batch, rendendo così l’elaborazione del flusso un caso speciale. Apache Flink, al contrario, tratta l’elaborazione batch come un caso speciale e non usa il micro batching.
- Migliore supporto per l’elaborazione ciclica e iterativa: Flink fornisce alcune operazioni aggiuntive che permettono di implementare cicli nella vostra applicazione di streaming e algoritmi che hanno bisogno di eseguire diverse iterazioni su dati batch.
- Gestione personalizzata della memoria: Apache Flink è un’applicazione Java, ma non si basa interamente sul garbage collector della JVM. Implementa un gestore di memoria personalizzato che memorizza i dati da elaborare in array di byte. Questo permette di ridurre il carico su un garbage collector e di aumentare le prestazioni. Potete leggerlo in questo post del blog.
- Latenza più bassa e throughput più elevato: Molteplici test fatti da terzi suggeriscono che Apache Flink ha una latenza più bassa e un throughput più alto rispetto ai suoi concorrenti.
- Potenti operatori di finestre: Quando avete bisogno di elaborare un flusso di dati nella maggior parte dei casi avete bisogno di applicare una funzione a un gruppo finito di elementi in un flusso. Per esempio, potreste aver bisogno di contare quanti click la vostra applicazione ha ricevuto in ogni intervallo di cinque minuti, o potreste voler sapere qual è stato il tweet più popolare su Twitter in ogni intervallo di dieci minuti. Mentre Spark supporta alcuni di questi casi d’uso, Apache Flink fornisce un insieme molto più potente di operatori per l’elaborazione dei flussi.
- Implementa leggere istantanee distribuite: Questo permette ad Apache Flink di fornire un basso overhead e garanzie di elaborazione only-once nell’elaborazione dei flussi, senza utilizzare il micro batching come fa Spark.
Così, stai lavorando ad un nuovo progetto, e hai bisogno di scegliere un software per esso. Cosa dovrebbe usare ypi? Spark? Flink?
Ovviamente, non c’è una risposta giusta o sbagliata qui. Se hai bisogno di fare complesse elaborazioni di flussi, allora ti consiglierei di usare Apache Flink. Ha un migliore supporto per l’elaborazione dei flussi e alcuni miglioramenti significativi.
Se non avete bisogno di funzioni di elaborazione dei flussi all’avanguardia e volete stare sul sicuro, potrebbe essere meglio rimanere con Apache Spark. È un progetto più maturo, ha una base di utenti più grande, più materiale didattico e più librerie di terze parti. Ma tenete a mente che Apache Flink sta chiudendo questo gap di minuto in minuto. Sempre più progetti stanno scegliendo Apache Flink man mano che diventa un progetto più maturo.
Se d’altra parte, vi piace sperimentare con le ultime tecnologie, dovete assolutamente dare una possibilità ad Apache Flink.
Tutto questo significa che Apache Spark è obsoleto e tra un paio d’anni useremo tutti Apache Flink? La risposta potrebbe sorprendervi. Mentre Flink ha alcune caratteristiche impressionanti, Spark non rimane lo stesso. Per esempio, Apache Spark ha introdotto la gestione della memoria personalizzata nel 2015 con il rilascio del progetto Tungsten, e da allora, ha aggiunto caratteristiche che sono state introdotte per la prima volta da Apache Flink. Il vincitore non è ancora deciso.
Nei prossimi post del blog scriverò di più su come è possibile utilizzare Apache Flink per l’elaborazione batch e stream, quindi rimanete sintonizzati!
Se volete saperne di più su Apache Flink, potete dare un’occhiata al mio corso Pluralsight dove tratto Apache Flink in modo più dettagliato. Ecco una breve anteprima di questo corso.