2015-07-09 10 views
5

Sto cercando di implementare un'architettura Lambda utilizzando i seguenti strumenti: Apache Kafka per ricevere tutti i datapoint, Spark per l'elaborazione in batch (Big Data), Spark Streaming in tempo reale (dati veloci) e Cassandra per memorizzare i risultati.Lambda Architecture con Apache Spark

Inoltre, tutti i datapoint che si ricevono sono correlati a una sessione utente e, pertanto, per l'elaborazione batch, sono interessato solo a elaborare i punti dati una volta che la sessione è terminata. Quindi, dal momento che sto usando Kafka, l'unico modo per risolverlo (supponendo che tutti i punti dati siano memorizzati nello stesso argomento) è che il batch recuperi tutti i messaggi nell'argomento e quindi ignori quelli che corrispondono alle sessioni che non ho ancora finito.

Quindi, quello che vorrei porre è:

  • È questo un buon approccio per l'attuazione del Lambda Architettura? O dovresti usare invece Haddop e Storm? (Non riesco a trovare informazioni su persone che usano Kafka e Apache Spark per l'elaborazione in batch, Riduzione mappa)
  • Esiste un approccio migliore per risolvere il problema delle sessioni utente?

Grazie.

risposta

4

Questo è un buon approccio. Usando Spark sia per la velocità e batch layer è possibile scrivere una volta la logica e utilizzarla in entrambi i contesti.

Per quanto riguarda il problema della sessione, dal momento che lo stai facendo in modalità batch, perché non inserire solo i dati da Kafka in HDFS o Cassandra e quindi scrivere le query per le sessioni complete lì? Potresti utilizzare la "connessione diretta" di Spark Streaming a Kafka per farlo.

0

Attualmente sto lavorando alla stessa implementazione. Uso Kafka, HBase, Spark e Spark Streaming.

C'è un sacco di cose da considerare quando si usano queste tecnologie e probabilmente non c'è una risposta semplice.

I punti principali di Spark Streaming sono che si ottiene una latenza minima di 100 ms per i dati del flusso, nonché un altro grosso problema per me, l'incasinamento dell'ordine dei dati consumati dal lavoro di streaming. Che con una combinazione di potenziali ritardatari risulta in completa mancanza di fiducia che sto elaborando i dati in ordine almeno parziale (almeno a mia conoscenza). Storm presumibilmente risolve questi problemi, ma non posso garantirlo poiché non l'ho usato.

In termini di livello batch, Spark è decisamente migliore di MapReduce in quanto è più veloce e più flessibile.

Quindi viene il problema con la sincronizzazione tra il batch e la velocità in termini di conoscenza del punto in cui i dati del lavoro batch si fermano e la velocità continua. Risolve il problema avendo il mio livello di velocità anche quello che inserisce i dati in HBase prima di eseguirne l'elaborazione.

Questo è solo un mucchio di punti casuali, spero che alcuni di loro aiutino.

0

echo la nota di Dean Wampler che questo è un buon approccio specialmente se non si hanno requisiti specifici che ti allontanino da Spark come strumento di scelta per i livelli Batch e Speed.Per aggiungere:

Non è necessario ri-consumare tutti i dati per una sessione da un argomento prima che sia possibile elaborarlo assumendo che cosa si sta facendo con esso (la riduzione) è un'operazione associativa . Anche se non è associativo (come gli utenti unici), può ancora essere OK con una stima altamente accurata che può essere calcolata iterativamente come Hyper Log Log. Probabilmente utilizzerai una sorta di aggregazione di stato. In Spark puoi farlo usando updateStateByKey, o preferibilmente, le funzioni mapWithState.

Se siete alla ricerca di esempi concreti sulle specificamente le tecnologie e casi d'uso di cui parli, ti indicherò al corso Pluralsight dove si può imparare tutto su di esso e praticarlo Applying the Lambda Architecture with Spark, Kafka, and Cassandra

ho anche notare che se quello che stai facendo è abbastanza semplice e perché stai già usando Kafka, potresti prendere in considerazione Kafka Connect per la persistenza HDFS e gli stream di Kafka per lo streaming. Potresti persino usare i flussi di Kafka per trasmettere i dati direttamente a Kafka e usare Kafka Connect per condurli a destinazioni multiple come Cassandra ed ElasticSearch. Cito Kafka Streams perché porta anche la capacità di mantenere uno stato in memoria ed eseguire semplici operazioni di streaming.

Buona fortuna!