Questo post è una pubblicazione ospite scritto da Yaroslav Tkachenko, un architetto software di Activision.
Apache Spark è uno dei framework di elaborazione dati su larga scala più popolari e potenti. È stato creato come alternativa al framework MapReduce di Hadoop per carichi di lavoro batch, ma ora supporta anche SQL, machine learning e stream processing. Oggi voglio concentrarmi su Spark Streaming e mostrare alcune opzioni disponibili per l’elaborazione del flusso.
L’elaborazione dei dati di flusso viene utilizzata quando i dati dinamici vengono generati continuamente e spesso si trovano nei casi d’uso dei big data. Nella maggior parte dei casi i dati vengono elaborati in tempo quasi reale, un record alla volta e le informazioni ricavate dai dati vengono utilizzate anche per fornire avvisi, renderizzare dashboard e alimentare modelli di apprendimento automatico in grado di reagire rapidamente alle nuove tendenze all’interno dei dati.
DStreams vs. DataFrames
Spark Streaming è andato alpha con Spark 0.7.0. Si basa sull’idea di flussi discretizzati o DStreams. Ogni DStream è rappresentato come una sequenza di RDD, quindi è facile da usare se si proviene da carichi di lavoro batch supportati da RDD di basso livello. DStreams ha subito molti miglioramenti in quel periodo di tempo, ma c’erano ancora varie sfide, principalmente perché è un’API di livello molto basso.
Come soluzione a queste sfide, Spark Structured Streaming è stato introdotto in Spark 2.0 (e divenne stabile in 2.2) come estensione costruita su Spark SQL. Per questo motivo, sfrutta il codice SQL Spark e le ottimizzazioni della memoria. Lo streaming strutturato offre anche astrazioni molto potenti come le API Dataset / DataFrame e SQL. Non più trattare con RDD direttamente!
Sia lo streaming strutturato che lo streaming con DStreams utilizzano il micro-batching. La differenza più grande è la latenza e le garanzie di consegna dei messaggi: lo streaming strutturato offre una consegna esattamente una volta con latenza di oltre 100 millisecondi, mentre lo Streaming con l’approccio DStreams garantisce solo una consegna almeno una volta, ma può fornire latenze millisecondi.
Personalmente preferisco lo streaming strutturato Spark per casi d’uso semplici, ma lo streaming Spark con DStreams è davvero buono per topologie più complicate a causa della sua flessibilità. Ecco perché di seguito voglio mostrare come utilizzare lo streaming con DStreams e lo streaming con DataFrames (che viene in genere utilizzato con lo streaming strutturato Spark) per consumare ed elaborare i dati da Apache Kafka. Userò Scala, Apache Spark 2.3 e Apache Kafka 2.0.
Inoltre, per esempio, eseguirò i miei lavori utilizzando i notebook Apache Zeppelin forniti da Qubole. Qubole è una piattaforma dati che uso quotidianamente. Gestisce cluster Hadoop e Spark, semplifica l’esecuzione di query Hive e Presto ad hoc e fornisce anche notebook Zeppelin gestiti che uso felicemente. Con Qubole non ho bisogno di pensare molto alla configurazione e alla messa a punto di Spark e Zeppelin, è solo gestito per me.
Il caso d’uso effettivo che ho è molto semplice:
- Una sorta di telemetria è scritta a Kafka: piccolo JSON messaggi con i metadati e arbitrario di coppie chiave/valore
- vorrei collegare a Kafka, consumare, e deserializzare i messaggi
- Quindi applicare trasformazioni, se necessario
- Raccogliere alcune aggregazioni
- Infine, mi interessa anomalie e in generale non dati, dato che non hanno il controllo del produttore, voglio prendere le cose come Null, stringhe vuote, forse le date non corrette e altri valori con formati specifici, etc.
- Il lavoro dovrebbe essere eseguito per un certo tempo, quindi terminare automaticamente. In genere, i lavori di streaming Spark vengono eseguiti continuamente, ma a volte potrebbe essere utile eseguirlo ad hoc per l’analisi/debug (o come esempio nel mio caso, poiché è così facile eseguire un lavoro Spark in un notebook).
Streaming con DStreams
In questo approccio usiamo DStreams, che è semplicemente una raccolta di RDDs.
Streaming con DataFrames
Ora possiamo provare a combinare lo streaming con l’API DataFrames per ottenere il meglio da entrambi i mondi!
Conclusione
Quale approccio è migliore? Poiché DStream è solo una raccolta di RDD, viene in genere utilizzato per trasformazioni e elaborazioni di basso livello. L’aggiunta di un’API DataFrames fornisce astrazioni molto potenti come SQL, ma richiede un po ‘ più di configurazione. E se hai un semplice caso d’uso, Spark Structured Streaming potrebbe essere una soluzione migliore in generale!