Vous êtes sur la page 1sur 29

Big Data Analytics

« Pilotage de la performance pour une bonne gouvernance des entreprises »

CHAPITRE 4 – Spark Streaming


Spark Stack

• Spark SQL : pour le traitement de données


(SQL et non structuré)

• Spark Streaming : traitement de flux de


données en direct (live streaming)

• MLlib : Algorithmes Machine Learning

• GraphX : Traitement de graphes

2
Qu'est-ce que Spark Streaming ?

• Framework pour le traitement de flux à grande échelle

• Échelles à des centaines de nœuds

• Peut atteindre des latences à échelle de seconde

• S'intègre au traitement par lots et interactif de Spark

• Fournit une API simple pour la mise en œuvre d'un algorithme complexe

• Peut absorber les flux de données en streaming de Kafka, Flume, ZeroMQ, ...

3
Motivation
• De nombreuses applications importantes doivent traiter de gros flux de données
en temps réel et fournir des résultats en temps quasi réel.
• Tendances des réseaux sociaux
• Statistiques du site
• Systèmes de détection d'intrusion
• ...

• Nécessite de grands clusters pour gérer les


charges de travail

• Exiger des latences de quelques secondes


4
Besoin d’un framework…

… Pour construire de telles applications complexes de traitement


de flux

Mais quelles sont les exigences


d'un tel framework?

5
Exigences

• Evolutif aux grands groupes

• Latences de deuxième échelle

• Modèle de programmation simple

• Intégré au traitement par lots et interactif

6
Traitement de flux avec état
• Les systèmes de streaming traditionnels ont mutable state
un modèle de traitement enregistrement
par enregistrement basé sur les événements input
• Chaque nœud a l'état mutable records
• Pour chaque enregistrement, mise à jour et node 1
envoi de nouveaux enregistrements
node 3
input
• L'état est perdu si le nœud meurt ! records
node 2
• Faire du traitement de flux avec état
tolérant aux pannes est un défi

7
Systèmes de streaming existants

• Storm
• Enregistrement en boucle si non traité par un nœud
• Traite chaque enregistrement au moins une fois
• Peut mettre à jour l'état mutable deux fois !
• L'état mutable peut être perdu en cas d'échec !

• Trident – Utiliser les transactions pour mettre à jour l'état


• Traite chaque enregistrement exactement une fois
• Mise à jour lente des transactions par État

8
Exigences

• Evolutif aux grands groupes

• Latences de deuxième échelle

• Modèle de programmation simple

• Tolérance aux pannes efficace dans les traitements avec état

9
Traitement de flux discretisé

Exécuter un calcul en continu sous forme d'une


série de très petits travaux par lots déterministes
live data stream
Spark
 Couper le flux de streaming en lots de X secondes Streaming
 Spark traite chaque lot de données comme des RDD
batches of X seconds
à l'aide d'opérations de RDD.
 Enfin, les résultats traités des opérations RDD sont
renvoyés par lots. Spark
processed results

10
Traitement de flux discretisé

Exécuter un calcul en continu sous forme d'une


série de très petits travaux par lots déterministes
live data stream
Spark
 Taille des lots aussi basse que ½ seconde, latence ~ 1 Streaming
seconde
batches of X seconds
 Possibilité de combiner le traitement par lots et le
traitement en continu dans le même système

Spark
processed results

11
Exemple 1 - Récupérer les hashtags de Twitter

val tweets = ssc.twitterStream(<Twitter username>, <Twitter password>)

DStream: a sequence of RDD representing a stream of data

Twitter Streaming API batch @ t batch @ t+1 batch @ t+2

tweets DStream

stored in memory as an RDD


(immutable, distributed)

12
Exemple 1 - Récupérer les hashtags de Twitter

val tweets = ssc.twitterStream(<Twitter username>, <Twitter password>)


val hashTags = tweets.flatMap (status => getTags(status))

new DStream transformation: modify data in one Dstream to create another DStream

batch @ t batch @ t+1 batch @ t+2

tweets DStream

flatMap flatMap flatMap


hashTags Dstream new RDDs created for


[#cat, #dog, … ] every batch

13
Exemple 1 - Récupérer les hashtags de Twitter

val tweets = ssc.twitterStream(<Twitter username>, <Twitter password>)


val hashTags = tweets.flatMap (status => getTags(status))
hashTags.saveAsHadoopFiles("hdfs://...")

output operation: to push data to external storage


batch @ t batch @ t+1 batch @ t+2
tweets DStream
flatMap flatMap flatMap
hashTags DStream
save save save
every batch saved
to HDFS

14
Exemple Java

Scala
val tweets = ssc.twitterStream(<Twitter username>, <Twitter password>)
val hashTags = tweets.flatMap (status => getTags(status))
hashTags.saveAsHadoopFiles("hdfs://...")

Java
JavaDStream<Status> tweets = ssc.twitterStream(<Twitter username>, <Twitter
password>)
JavaDstream<String> hashTags = tweets.flatMap(new Function<...> { })
hashTags.saveAsHadoopFiles("hdfs://...")
Function object to define the transformation

15
Tolérance aux fautes

 Les RDD mémorisent la séquence d'opérations tweets input data


créée à partir des données d'entrée tolérantes RDD replicated
aux pannes in memory

flatMap
 Les lots de données d'entrée sont répliqués
dans la mémoire de plusieurs nœuds « Worker »,
donc tolérants aux pannes hashTags
RDD lost partitions
recomputed on
 Les données perdues en raison d'une
other workers
défaillance de l'opérateur, peuvent être
recalculées à partir des données d'entrée

16
Concepts clés

• DStream – séquence de RDD représentant un flux de données


• Twitter, HDFS, Kafka, Flume, ZeroMQ, Akka Actor, TCP sockets

• Transformations – modifier les données d'un DStream à un autre


• Opérations standard RDD – map, countByValue, reduce, join, …
• Opérations avec état – window, countByValueAndWindow, …

• Output Operations – envoyer des données à une entité externe


• saveAsHadoopFiles – enregistre dans HDFS
• foreach – tout faire avec chaque lot de résultats

17
Exemple 2 - Compter les hashtags

val tweets = ssc.twitterStream(<Twitter username>, <Twitter password>)


val hashTags = tweets.flatMap (status => getTags(status))
val tagCounts = hashTags.countByValue()

batch @ t batch @ t+1 batch @ t+2


tweets
flatMap flatMap flatMap

hashTags
map map map


reduceByKey reduceByKey reduceByKey
tagCounts
[(#cat, 10), (#dog, 25), ... ]

18
Exemple 3 - Comptez les hashtags sur les
10 dernières minutes
val tweets = ssc.twitterStream(<Twitter username>, <Twitter password>)
val hashTags = tweets.flatMap (status => getTags(status))
val tagCounts = hashTags.window(Minutes(10), Seconds(1)).countByValue()

sliding window
window length sliding interval
operation

19
Exemple 3 - Comptez les hashtags sur les
10 dernières minutes
val tagCounts = hashTags.window(Minutes(10), Seconds(1)).countByValue()

t-1 t t+1 t+2 t+3


hashTags

sliding window

countByValue
tagCounts count over all
the data in the
window

20
CountByValue basé sur Smart window

val tagCounts = hashtags.countByValueAndWindow(Minutes(10), Seconds(1))

t-1 t t+1 t+2 t+3


hashTags
countByValue
add the counts
from the new
batch in the
subtract the
counts from – + window
tagCounts batch before
the window
+ ?

21
Reduce base sur Smart window

• Technique permettant de calculer progressivement le nombre généralisé à de


nombreuses opérations de Reduce
• Besoin d'une fonction pour “inverse reduce” (“subtract” pour calculer)

• Implémenter le calcul :
hashTags.reduceByKeyAndWindow(_ + _, _ - _, Minutes(1), …)

22
Traitement avec état à tolérance de pannes

Toutes les données intermédiaires sont des RDD, donc peuvent être recalculées en
cas de perte
t-1 t t+1 t+2 t+3
hashTags

tagCounts

23
Traitement avec état à tolérance de pannes

• Les données à état ne sont pas perdues même si un nœud « Worker » meurt
• Ne change pas la valeur de votre résultat

• Exactement une seule sémantique pour toutes les transformation


• Pas de double calcul !

24
Autres opérations

 Maintenir un état arbitraire, tracer les sessions


- Maintenir le sentiment par utilisateur en tant qu'état et le mettre à jour avec ses
tweets
tweets.updateStateByKey(tweet => updateMood(tweet))

 Effectuer des calculs Spark RDD arbitraires dans DStream


- Joindre les tweets entrants avec un fichier spam pour filtrer les mauvais tweets
tweets.transform(tweetsRDD => {
tweetsRDD.join(spamHDFSFile).filter(...)
})

25
Performances
Peut traiter 6 Go / seconde (60M d’enregistrements / seconde) de données sur
100 nœuds à une latence inférieure à 1 seconde
- Testé avec 100 flux de données sur 100 instances EC2 avec 4 cœurs chacun

7 3.5
Grep WordCount
Cluster Thhroughput (GB/s)

Cluster Throughput (GB/s)


6 3
5 2.5
4 2
3 1.5
2 1
1 sec 1 sec
1 0.5
2 sec 2 sec
0 0
0 10 20 30 40 50 60 70 80 90 100 0 50 100
# Nodes in Cluster # Nodes in Cluster

26
Récupération Rapide des erreurs

Récupère des défauts / retards en 1 seconde

27
Applications réelles : Conviva

4000000

Active sessions (millions)


3500000

• Surveillance en temps réel des métadonnées 3000000

vidéo 2500000
2000000
• Atteint 1-2 secondes de latence
1500000
• Des millions de sessions vidéo traitées
1000000
• Échelle linéaire avec la taille du cluster
500000
0
0 10 20 30 40 50 60 70
# Nodes in Cluster

28
Applications réelles : Mobile Millennium
Project

2000

GPS observations per second


• Estimation du temps de transit du trafic en
utilisant l'apprentissage automatique en 1600
ligne sur des observations GPS
1200
• Simulations par chaînes de Markov sur les
observations GPS, 800
• Très gourmand en ressources processeur,
400
nécessite des dizaines de machines pour
un calcul utile, 0
0 20 40 60 80
• Échelle linéaire avec la taille du cluster.
# Nodes in Cluster

29

Vous aimerez peut-être aussi