#IaaC	

Realtime Web avec Akka, Kafka,
Spark et Mesos
@hayssams
Hayssam Saleh
@jpbunaz
Jean-Philippe Bunaz
#IaaC	

Sommaire
Tomcat	

Tomcat	

FrontfacingApp	

FrontfacingApp	

Akka	

Akka	

Akka	

Akka	

Stream Processing	

(Spar...
#IaaC	

Pourquoi Akka
Mesos	

Tomcat	

Tomcat	

FrontfacingApp	

FrontfacingApp	

Akka	

Akka	

Stream Processing	

(Spark...
#IaaC	

Kompass
• Annuaire d’entreprise
• Moteur de recherche
• Afficher les informations
• Disponible dans 70 pays
• …
@j...
#IaaC	

Objectifs
Quelles
entreprises
sont vues	

Nombre de
visiteurs	

Mise en place d’un plan de taggage
@jpbunaz
#IaaC	

Challenge
Un tag par
prestataire	

Changer
les règles	

Informations
en session	

Intercepter les requêtes sur le ...
#IaaC	

Utilisation d’une Valve
A
P
A
C
H
E	

TOMCAT	

WEB APP	

SESSION	

VALVE	

RESPONSE
REQUEST
?	

PARAM	

LOG	

REQU...
#IaaC	

Impacts
Mon log
peut être
long	

Différent
type de log	

Perturbe mon
application	

La valve doit être non bloquan...
#IaaC	

Valve non-bloquante
A
P
A
C
H
E	

TOMCAT	

WEB APP	

SESSION	

VALVE	

?	

PARAM	

REQUEST
ACTOR	

LOG	

MAILBOX	
...
#IaaC	

Acteur : Vue d’avion
TASK	

2	

TASK	

1	

TASK	

4	

TASK	

4	

Tâches indépendantes qui
communiquent entre elles...
#IaaC	

Création d’un Message
case class MonMessage(param1: String, param2: String,
param3: String, param4: String)
	

@jp...
#IaaC	

Création d’un Acteur
class MonActeur() extends Actor {
def receive = {
case MonMessage(param1: String, param2: Str...
#IaaC	

Envoi du message à l’acteur
// Initialisation de l’acteur
val monActeur = actorSystem.actorOf(Props[MyActeur])
// ...
#IaaC	

Acteur : Points de vigilance
N’expose pas son état
interne
class UglyActeur() extends Actor {
var variableCanAcces...
#IaaC	

Acteur : Points de vigilance
Les messages doivent
être immuables
case class UglyMessage(
var param1: String,
var p...
#IaaC	

Acteur : Points de vigilance
TASK	

	

	

	

Working…	

@jpbunaz	

• L’acteur ne traite qu’un seul message à la fo...
#IaaC	

Maitriser le nombre d’acteurs
Nombre
d’Acteur !!!	

Un message
à la fois !!!	

Utiliser un router
@jpbunaz
#IaaC	

Routeur
• Maîtriser le nombre d’Acteur
• Différents types de routage (RoundRobin, Random …)
• Configuration extern...
#IaaC	

Créer un routeur
val monRouteur = actorSystem.actorOf(
FromConfig.props(routeProps = Props[MonActeur])
, name = "m...
#IaaC	

Configurer un routeur
Akka.actor.deployment {
/monRouteur {
router = round-robin-pool
nr-of-instances = 5
}
}
@jpb...
#IaaC	

Conclusion sur les Acteurs
• Simple à mettre en oeuvre
• Contrôle sur les ressources en adéquation avec la
charge
...
#IaaC	

Objectifs
Spark Streaming	

Spark Classic	

Kafka	

Mesos	

⇒ Scale Up / Scale Out
@hayssams
#IaaC	

Pourquoi Kafka ?
Mesos	

Tomcat	

Tomcat	

FrontfacingApp	

FrontfacingApp	

Akka	

Akka	

Akka	

Akka	

Stream Pr...
#IaaC	

Avant les messages groups
U2E3	

 U1E3	

 U2E2	

 U1E2	

 U2E1	

•  Solution traditionnelle : Un seul consommateur...
#IaaC	

Avec Kafka : partitionnement par clef
U2E3	

 U2E2	

 U2E1	

U1E3	

 U1E2	

 U1E1	

U2E3	

 U2E2	

 U2E1	

U1E3	

...
#IaaC	

Pourquoi Spark Streaming
Mesos	

Tomcat	

Tomcat	

FrontfacingApp	

FrontfacingApp	

Akka	

Akka	

Akka	

Akka	

S...
#IaaC	

•  Récupération du Tuple(request, response, session, url)
• val tuples = kafka.initStream(context, "requests », 2 ...
#IaaC	

Avec Spark: API unique pour la batch et le streaming
Flux continu provevant de réseau	

2s	

 2s	

 2s	

 2s	

 2s...
#IaaC	

Avec Spark: Tolérance aux pannes au coût minimum
val tuples = kafka.initStream(context,"requests », 2 seconds"
!
r...
#IaaC	

Mesos	

Tomcat	

Tomcat	

FrontfacingApp	

FrontfacingApp	

Akka	

Akka	

Akka	

Akka	

Stream Processing	

(Spark...
#IaaC	

Notification des clients
rdd= Sc.readFromXMLFile(…)"
rdd.persist!
val updatedRDD = rdd.filter(product => product.e...
#IaaC	

Avec Spark : Une riche librairie d’opérations
d1	

d2	

d3	

d1	

d2	

d3	

d1	

d2	

d3	

d2	

d3	

d1	

d2	

d3	...
#IaaC	

Mesos	

Tomcat	

Tomcat	

FrontfacingApp	

FrontfacingApp	

Akka	

Akka	

Akka	

Akka	

Stream Processing	

(Spark...
#IaaC	

Pourquoi Zookeeper
• Election de leader pour la tolérance au pannes
Maitre	

Esclave	

	

Esclave	

Esclave	

Mait...
#IaaC	

Pourquoi Zookeeper
• Centralisation de la configuration
/
services
…
master
nodes
es
node1
node2
node1
Zookeeper	
...
#IaaC	

Mesos	

Tomcat	

Tomcat	

FrontfacingApp	

FrontfacingApp	

Akka	

Akka	

Akka	

Akka	

Stream Processing	

(Spark...
#IaaC	

Avant Mesos Démultiplication nombre de VMs
•  €€€ Cluster Tomcat : Frontend facing app
•  € Cluster Kafka : Middle...
#IaaC	

Avant Mesos Démultiplication nombre de VMs
Dev.	

Int.	

PréProd.	

Prod.	

•  Requiert d’exécuter un OS en
entier...
#IaaC	

Avec Linux cgroups
OS Hôte	

OS Guest	

 OS Guest	

 OS Guest	

App1	

 App2	

 App3	

OS Hôte	

App1	

 App2	

 A...
#IaaC	

Avec Mesos
Serveur	

	

Serveur	

	

Serveur	

	

Serveur	

	

80 CPU, 640Go	

	

App	

	

App	

	

App	

	

App	
...
#IaaC	

Architecture Mesos
Mesos Master	

Mesos Worker	

 Mesos Worker	

MonAppScheduler	

MonAppExecutor	

MonAppExecutor...
#IaaC	

Mesos	

Tomcat	

Tomcat	

FrontfacingApp	

FrontfacingApp	

Akka	

Akka	

Akka	

Akka	

Stream Processing	

(Spark...
#IaaC	

Pourquoi Marathon
• Eviter d’avoir à développer un Executor et un Scheduler pour les
applications « longue durée »...
#IaaC	

Exemple de commande Marathon
POST /v2/apps HTTP/1.1"
"
{"
"id": "TomcatApp","
"cmd": "/path/bin/catalina.sh run $P...
@YourTwitterHandle	

#DVXFR14{session hashtag}	

#IaaC
#IaaC	

Conclusion
• Neal Real time Analytics
• Batch Analytics
• Middleware de messages
• Partage dynamique de ressources...
@YourTwitterHandle	

#DVXFR14{session hashtag}	

#IaaC
Prochain SlideShare
Chargement dans…5
×

Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014

3 590 vues

Publié le

Ce talk est un retour d’expérience sur la mise en œuvre de Spark et Streaming Spark. Nous aborderons :

La collecte des données à la volée dans l’application Web avec Akka
La séparation des producteurs et consommateurs avec Kafka
La transformation des données avec Spark et Streaming Spark
Le déploiement sur un cluster avec Apache Mesos

Publié dans : Ingénierie
0 commentaire
9 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 590
Sur SlideShare
0
Issues des intégrations
0
Intégrations
795
Actions
Partages
0
Téléchargements
119
Commentaires
0
J’aime
9
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014

  1. 1. #IaaC Realtime Web avec Akka, Kafka, Spark et Mesos @hayssams Hayssam Saleh @jpbunaz Jean-Philippe Bunaz
  2. 2. #IaaC Sommaire Tomcat Tomcat FrontfacingApp FrontfacingApp Akka Akka Akka Akka Stream Processing (Spark Streaming) RealtimeViews (ElasticSearch) All Data (Spark) Precompute Views BatchViews Query (Tomcat,Kibana,…) NewDataStream Kafka Speed Layer Batch Layer Serving Layer Product Updates Mesos Marathon Zookeeper Server 1 Server 2 Leader
  3. 3. #IaaC Pourquoi Akka Mesos Tomcat Tomcat FrontfacingApp FrontfacingApp Akka Akka Stream Processing (Spark Streaming) RealtimeViews (ElasticSearch) All Data (Spark) Precompute Views BatchViews Query (Tomcat,Kibana,…) NewDataStream Kafka Speed Layer Batch Layer Serving Layer Product Updates Marathon Zookeeper Server 1 Server 2 Leader
  4. 4. #IaaC Kompass • Annuaire d’entreprise • Moteur de recherche • Afficher les informations • Disponible dans 70 pays • … @jpbunaz
  5. 5. #IaaC Objectifs Quelles entreprises sont vues Nombre de visiteurs Mise en place d’un plan de taggage @jpbunaz
  6. 6. #IaaC Challenge Un tag par prestataire Changer les règles Informations en session Intercepter les requêtes sur le serveur @jpbunaz
  7. 7. #IaaC Utilisation d’une Valve A P A C H E TOMCAT WEB APP SESSION VALVE RESPONSE REQUEST ? PARAM LOG REQUEST RESPONSE REQUEST RESPONSE @jpbunaz
  8. 8. #IaaC Impacts Mon log peut être long Différent type de log Perturbe mon application La valve doit être non bloquante @jpbunaz
  9. 9. #IaaC Valve non-bloquante A P A C H E TOMCAT WEB APP SESSION VALVE ? PARAM REQUEST ACTOR LOG MAILBOX REQUEST REQUEST @jpbunaz
  10. 10. #IaaC Acteur : Vue d’avion TASK 2 TASK 1 TASK 4 TASK 4 Tâches indépendantes qui communiquent entre elles de manière asynchrone via des messages TASK 3 TASK 5 @jpbunaz
  11. 11. #IaaC Création d’un Message case class MonMessage(param1: String, param2: String, param3: String, param4: String) @jpbunaz
  12. 12. #IaaC Création d’un Acteur class MonActeur() extends Actor { def receive = { case MonMessage(param1: String, param2: String, param3: String, param4: String) => // Code de logging case } } @jpbunaz
  13. 13. #IaaC Envoi du message à l’acteur // Initialisation de l’acteur val monActeur = actorSystem.actorOf(Props[MyActeur]) // Initialisation du message val monMessage = MonMessage("value1", "value2", "value3", "value4") // Envoi aynchrone du message à l’acteur monActeur ! monMessage // Code exécution avant traitement du message ExecuterLaSuiteDansLaFoulée() @jpbunaz
  14. 14. #IaaC Acteur : Points de vigilance N’expose pas son état interne class UglyActeur() extends Actor { var variableCanAccess = null def receive = { case String => // My acteur code… } } @jpbunaz
  15. 15. #IaaC Acteur : Points de vigilance Les messages doivent être immuables case class UglyMessage( var param1: String, var param2: String) @jpbunaz
  16. 16. #IaaC Acteur : Points de vigilance TASK Working… @jpbunaz • L’acteur ne traite qu’un seul message à la fois • Les messages sont mis en attente dans une boite aux lettres
  17. 17. #IaaC Maitriser le nombre d’acteurs Nombre d’Acteur !!! Un message à la fois !!! Utiliser un router @jpbunaz
  18. 18. #IaaC Routeur • Maîtriser le nombre d’Acteur • Différents types de routage (RoundRobin, Random …) • Configuration externalisée dans un fichier de propriétés @jpbunaz
  19. 19. #IaaC Créer un routeur val monRouteur = actorSystem.actorOf( FromConfig.props(routeProps = Props[MonActeur]) , name = "monRouteur" ) @jpbunaz
  20. 20. #IaaC Configurer un routeur Akka.actor.deployment { /monRouteur { router = round-robin-pool nr-of-instances = 5 } } @jpbunaz
  21. 21. #IaaC Conclusion sur les Acteurs • Simple à mettre en oeuvre • Contrôle sur les ressources en adéquation avec la charge • Gestion multithread transparente, pas de lock, de synchronized • Naturellement asynchrone @jpbunaz
  22. 22. #IaaC Objectifs Spark Streaming Spark Classic Kafka Mesos ⇒ Scale Up / Scale Out @hayssams
  23. 23. #IaaC Pourquoi Kafka ? Mesos Tomcat Tomcat FrontfacingApp FrontfacingApp Akka Akka Akka Akka Stream Processing (Spark Streaming) RealtimeViews (ElasticSearch) All Data (Spark) Precompute Views BatchViews Query (Tomcat,Kibana,…) NewDataStream Kafka Speed Layer Batch Layer Serving Layer Product Updates Marathon Zookeeper Server 1 Server 2 Leader @hayssams
  24. 24. #IaaC Avant les messages groups U2E3 U1E3 U2E2 U1E2 U2E1 •  Solution traditionnelle : Un seul consommateur pour toute la file U1E1 U2E3 U1E3 U2E2 U1E2 U2E1 U1E1 @hayssams
  25. 25. #IaaC Avec Kafka : partitionnement par clef U2E3 U2E2 U2E1 U1E3 U1E2 U1E1 U2E3 U2E2 U2E1 U1E3 U1E2 U1E1 Cluster Kafka P1R1 P2R1 P1R2 P2R2 Pro Cons Cons Avec JMSGroupID •  Un local manager (SPOF) plusieurs remote •  Requiert un serveur de backup @hayssams Avec Kafka •  Support natif du partitionnement •  Réplication des messages •  Tolérance au pannes
  26. 26. #IaaC Pourquoi Spark Streaming Mesos Tomcat Tomcat FrontfacingApp FrontfacingApp Akka Akka Akka Akka Stream Processing (Spark Streaming) RealtimeViews (ElasticSearch) All Data (Spark) Precompute Views BatchViews Query (Tomcat,Kibana,…) NewDataStream Kafka Speed Layer Batch Layer Serving Layer Product Updates Marathon Zookeeper Server 1 Server 2 Leader @hayssams
  27. 27. #IaaC •  Récupération du Tuple(request, response, session, url) • val tuples = kafka.initStream(context, "requests », 2 seconds)" •  Validation des règles • rdd = tuples.filter( t => RulesHandler.match(t))" •  Transformation du tuple en document JSON • rdd2 = rdd.map( t => toDocument)" •  Injection dans ES • rdd2.foreachRDD(doc => es.insert doc)" •  Identification des relations • rdd3 = rdd.flatMap(_.toRelations)! • rdd3.foreachRDD(rel => neo4j.insert rel)" => Statistiques d’accès en temps réel Traitement continu des accès utilisateurs @hayssams
  28. 28. #IaaC Avec Spark: API unique pour la batch et le streaming Flux continu provevant de réseau 2s 2s 2s 2s 2s 2s 2s t t +16 •  Découpage du flux en un paquet de données (RDD) toutes les 2 secondes •  Un RDD est une collection de données RDD RDD RDD RDD RDD RDD RDD •  Chaque paquet est traité comme un comme un RDD soumis au batch Spark classique Out Out Out Out D Out D Out Out •  Spark exécute les opérations sur le RDD comme dans un batch classique et renvoie le résultat en retour. Spark •  Exécution de microbatchs @hayssams
  29. 29. #IaaC Avec Spark: Tolérance aux pannes au coût minimum val tuples = kafka.initStream(context,"requests », 2 seconds" ! rdd = tuples.filter( t => RulesHandler.match(t))" " rdd2 = rdd.map( t => toDocument)" " rdd2.foreachRDD(doc => es.insert doc) // via Kafka" ! rdd3 = rdd.flatMap(_.toRelations)! ! rdd3.foreachRDD(rel => neo4j.insert rel) // via Kafka KafkaInputDStream FilteredDStream MappedDStream ForEachDStream MappedDStream ForEachDStream •  Le code ci-dessus ne génère aucun calcul, juste un graphe d’objets •  Le Scheduler Spark va soumettre le graphe d’objets aux workers pour exécution •  J En cas de panne, il suffit juste de soumettre à nouveau le graphe d’objets à un autre worker. •  Pas besoin de réplication des résultats ou d’upstream backup @hayssams
  30. 30. #IaaC Mesos Tomcat Tomcat FrontfacingApp FrontfacingApp Akka Akka Akka Akka Stream Processing (Spark Streaming) RealtimeViews (ElasticSearch) All Data (Spark) Precompute Views BatchViews Query (Tomcat,Kibana,…) NewDataStream Kafka Speed Layer Batch Layer Serving Layer Product Updates Marathon Zookeeper Server 1 Server 2 Leader Pourquoi Spark Classic @hayssams
  31. 31. #IaaC Notification des clients rdd= Sc.readFromXMLFile(…)" rdd.persist! val updatedRDD = rdd.filter(product => product.existsInMapWithDifferentHash)" val newRDD = rdd.filter(product => !product.existInMap)" " val updateNotifications = updatedRDD.map(_.executeStrategies)" " val newNotifications = newRDD.map(_.executeStrategies)" " updateNotifications.union(newNotifications).foreachRDD(_.notifyClient)" " RDD Action @hayssams
  32. 32. #IaaC Avec Spark : Une riche librairie d’opérations d1 d2 d3 d1 d2 d3 d1 d2 d3 d2 d3 d1 d2 d3 d1 d2 d3 d1 d2 d3 map filter union groupByKey reduceByKey reduce collect count take first foreach … •  Avec en plus •  J Contrôle sur le partitionnement •  J broadcast •  J accumulateurs •  J Les chaînage d’actions ne requiert pas d’écriture intermédiaire sur disque @hayssams
  33. 33. #IaaC Mesos Tomcat Tomcat FrontfacingApp FrontfacingApp Akka Akka Akka Akka Stream Processing (Spark Streaming) RealtimeViews (ElasticSearch) All Data (Spark) Precompute Views BatchViews Query (Tomcat,Kibana,…) NewDataStream Kafka Speed Layer Batch Layer Serving Layer Product Updates Marathon Zookeeper Server 1 Server 2 Leader Pourquoi Apache Zookeeper @hayssams
  34. 34. #IaaC Pourquoi Zookeeper • Election de leader pour la tolérance au pannes Maitre Esclave Esclave Esclave Maitre de secours Esclave et maitre de secours Esclave et maitre de secours Esclave et maitre de secours Esclave et maitre de secours Election de leader Avec Zookeeper Tout noeud est un master potentiel @hayssams
  35. 35. #IaaC Pourquoi Zookeeper • Centralisation de la configuration / services … master nodes es node1 node2 node1 Zookeeper Server 1 Server 2 Leader Service Service 1.Enregistrementdesservices Client 2. Récupération de la localisation des workers 4. sollicitation du service 3. Sélection du worker @hayssams
  36. 36. #IaaC Mesos Tomcat Tomcat FrontfacingApp FrontfacingApp Akka Akka Akka Akka Stream Processing (Spark Streaming) RealtimeViews (ElasticSearch) All Data (Spark) Precompute Views BatchViews Query (Tomcat,Kibana,…) NewDataStream Kafka Speed Layer Batch Layer Serving Layer Product Updates Zookeeper Server 1 Server 2 Leader Pourquoi Mesos Marathon @hayssams
  37. 37. #IaaC Avant Mesos Démultiplication nombre de VMs •  €€€ Cluster Tomcat : Frontend facing app •  € Cluster Kafka : Middleware de messages •  €€ Cluster Spark •  €€€ Cluster ElasticSearch •  TTT : Compléxité de configuration •  Apache Mesos et Marathon à la rescousse •  Voir l’ensemble des VMs comme une seule machine sur laquelle tournent plusieurs JVMs @hayssams
  38. 38. #IaaC Avant Mesos Démultiplication nombre de VMs Dev. Int. PréProd. Prod. •  Requiert d’exécuter un OS en entier pour obtenir une isolation des ressources et de la sécurité •  Temps de démarrage assez long (5 à 10 minutes par VM) •  Plus d’OS => encore plus de systèmes à administrer •  Coût de licence des VMs •  Allocation statique => Sous utilisation de la CPU VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM @hayssams
  39. 39. #IaaC Avec Linux cgroups OS Hôte OS Guest OS Guest OS Guest App1 App2 App3 OS Hôte App1 App2 App3 •  Isolation •  CPU •  Mémoire •  I/O •  Réseau VM Linux cgroups @hayssams
  40. 40. #IaaC Avec Mesos Serveur Serveur Serveur Serveur 80 CPU, 640Go App App App App App App App App App •  J Partage des ressources •  J Tolérant aux pannes •  Pour les applications longue durée (MOM / AS) •  Si vous n’avez jamais cherché à savoir sur quel cœur s’exécute votre tâche alors vous n’avez probablement pas besoin de savoir non plus sur quel serveur. •  IaaC : Infrastructure as a (Single) Computer •  Faire fonctionner les différents environnements (dev / Int/ Preprod / Prod) sur la même infrastructure •  Y compris les jobs Jenkins @hayssams
  41. 41. #IaaC Architecture Mesos Mesos Master Mesos Worker Mesos Worker MonAppScheduler MonAppExecutor MonAppExecutor 2CPUs, 20Go Tâche •  Pour s’exécuter sur Mesos une application doit implémenter : •  Un scheduler •  Un Executor @hayssams
  42. 42. #IaaC Mesos Tomcat Tomcat FrontfacingApp FrontfacingApp Akka Akka Akka Akka Stream Processing (Spark Streaming) RealtimeViews (ElasticSearch) All Data (Spark) Precompute Views BatchViews Query (Tomcat,Kibana,…) NewDataStream Kafka Speed Layer Batch Layer Serving Layer Product Updates Marathon Zookeeper Server 1 Server 2 Leader Marathon @hayssams
  43. 43. #IaaC Pourquoi Marathon • Eviter d’avoir à développer un Executor et un Scheduler pour les applications « longue durée » • Marathon permet via une API REST de configurer des instances applicatives au dessus de Mesos en indiquant la commande à lancer @hayssams
  44. 44. #IaaC Exemple de commande Marathon POST /v2/apps HTTP/1.1" " {" "id": "TomcatApp"," "cmd": "/path/bin/catalina.sh run $PORT"," "mem": 1024," "cpus": 2.0," "instances": 3," "constraints": [" " " ]" }" " •  Marathon utilisé pour lancer •  Kafka •  ElasticSearch •  Tomcat •  Scale up/down par simple appel REST avec une nouvelle configuration Régulation de charge et découverte GET /apps/MonApp/tasks Hot haproxy.cfg reload @hayssams ["hostname", "UNIQUE", ""],! ["hostname", ”like", ”front{1,2}"]
  45. 45. @YourTwitterHandle #DVXFR14{session hashtag} #IaaC
  46. 46. #IaaC Conclusion • Neal Real time Analytics • Batch Analytics • Middleware de messages • Partage dynamique de ressources Spark Streaming Spark Classic Mesos Marathon Kafka Un seul framework IaaC Partionnement automatique @hayssams
  47. 47. @YourTwitterHandle #DVXFR14{session hashtag} #IaaC

×