+ All Categories
Home > Engineering > Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014

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

Date post: 26-Jan-2017
Category:
Upload: ippon
View: 3,637 times
Download: 3 times
Share this document with a friend
47
#IaaC Realtime Web avec Akka, Kafka, Spark et Mesos @hayssams Hayssam Saleh @jpbunaz Jean-Philippe Bunaz
Transcript
Page 1: Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014

#IaaC

Realtime Web avec Akka, Kafka, Spark et Mesos

@hayssams Hayssam Saleh

@jpbunaz Jean-Philippe Bunaz

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

#IaaC

Sommaire To

mca

t To

mca

t

Fron

t fa

cing

App

Fron

t fa

cing

App

Akka Akka

Akka Akka

Stream Processing (Spark Streaming)

Realtime Views (ElasticSearch)

All Data (Spark)

Precompute Views

Batch Views

Query

(Tomcat, K

ibana, …)

New

Data Stream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Mesos

Marathon Zookeeper

Server 1 Server 2 Leader

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

#IaaC

Pourquoi Akka

Mesos

Tom

cat

Tom

cat

Fron

t fa

cing

App

Fron

t fa

cing

App

Akka

Akka

Stream Processing (Spark Streaming)

Realtime Views (ElasticSearch)

All Data (Spark)

Precompute Views

Batch Views

Query

(Tomcat, K

ibana, …)

New

Data Stream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Marathon Zookeeper

Server 1 Server 2 Leader

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

#IaaC

Kompass • Annuaire d’entreprise

• Moteur de recherche

• Afficher les informations

• Disponible dans 70 pays

• … @jpbunaz

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

#IaaC

Objectifs

Quelles entreprises sont vues

Nombre de visiteurs

Mise en place d’un plan de taggage

@jpbunaz

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

#IaaC

Challenge

Un tag par prestataire

Changer les règles

Informations en session

Intercepter les requêtes sur le serveur

@jpbunaz

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

#IaaC

Utilisation d’une Valve

APACHE

TOMCAT

WEB APP

SESSION

VALVE

RESPONSE

REQUEST

?

PARAM

LOG

REQUEST

RESPONSE

REQUEST

RESPONSE

@jpbunaz

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

#IaaC

Impacts

Mon log peut être

long

Différent type de log

Perturbe mon application

La valve doit être non bloquante

@jpbunaz

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

#IaaC

Valve non-bloquante

APACHE

TOMCAT

WEB APP

SESSION

VALVE

?

PARAM

REQUEST

ACTOR

LOG MAILBOX

REQUEST REQUEST

@jpbunaz

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

#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

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

#IaaC

Création d’un Message

case class MonMessage(param1: String, param2: String, param3: String, param4: String)

@jpbunaz

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

#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

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

#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

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

#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

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

#IaaC

Acteur : Points de vigilance

Les messages doivent être immuables case class UglyMessage(

var param1: String, var param2: String)

@jpbunaz

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

#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

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

#IaaC

Maitriser le nombre d’acteurs

Nombre d’Acteur !!!

Un message à la fois !!!

Utiliser un router

@jpbunaz

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

#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

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

#IaaC

Créer un routeur

val monRouteur = actorSystem.actorOf( FromConfig.props(routeProps = Props[MonActeur]) , name = "monRouteur"

)

@jpbunaz

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

#IaaC

Configurer un routeur

Akka.actor.deployment {

/monRouteur { router = round-robin-pool nr-of-instances = 5

} }

@jpbunaz

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

#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

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

#IaaC

Objectifs

Spark Streaming

Spark Classic

Kafka

Mesos

⇒ Scale Up / Scale Out

@hayssams

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

#IaaC

Pourquoi Kafka ?

Mesos

Tom

cat

Tom

cat

Fron

t fa

cing

App

Fron

t fa

cing

App

Akka Akka

Akka Akka

Stream Processing (Spark Streaming)

Realtime Views (ElasticSearch)

All Data (Spark)

Precompute Views

Batch Views

Query

(Tomcat, K

ibana, …)

New

Data Stream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Marathon Zookeeper

Server 1 Server 2 Leader

@hayssams

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

#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

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

#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

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

#IaaC

Pourquoi Spark Streaming

Mesos

Tom

cat

Tom

cat

Fron

t fa

cing

App

Fron

t fa

cing

App

Akka Akka

Akka Akka

Stream Processing (Spark Streaming)

Realtime Views (ElasticSearch)

All Data (Spark)

Precompute Views

Batch Views

Query

(Tomcat, K

ibana, …)

New

Data Stream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Marathon Zookeeper

Server 1 Server 2 Leader

@hayssams

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

#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

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

#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

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

#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

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

#IaaC

Mesos

Tom

cat

Tom

cat

Fron

t fa

cing

App

Fron

t fa

cing

App

Akka Akka

Akka Akka

Stream Processing (Spark Streaming)

Realtime Views (ElasticSearch)

All Data (Spark)

Precompute Views

Batch Views

Query

(Tomcat, K

ibana, …)

New

Data Stream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Marathon Zookeeper

Server 1 Server 2 Leader

Pourquoi Spark Classic

@hayssams

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

#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

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

#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

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

#IaaC

Mesos

Tom

cat

Tom

cat

Fron

t fa

cing

App

Fron

t fa

cing

App

Akka Akka

Akka Akka

Stream Processing (Spark Streaming)

Realtime Views (ElasticSearch)

All Data (Spark)

Precompute Views

Batch Views

Query

(Tomcat, K

ibana, …)

New

Data Stream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Marathon Zookeeper

Server 1 Server 2 Leader

Pourquoi Apache Zookeeper

@hayssams

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

#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

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

#IaaC

Pourquoi Zookeeper • Centralisation de la configuration

/

services

master

nodes

es

node1

node2

node1

Zookeeper

Server 1 Server 2 Leader

Service

Service

1. E

nreg

istr

emen

t de

s se

rvic

es

Client

2. Récupération de la localisation des workers

4. sollicitation du service

3. Sélection du worker

@hayssams

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

#IaaC

Mesos

Tom

cat

Tom

cat

Fron

t fa

cing

App

Fron

t fa

cing

App

Akka Akka

Akka Akka

Stream Processing (Spark Streaming)

Realtime Views (ElasticSearch)

All Data (Spark)

Precompute Views

Batch Views

Query

(Tomcat, K

ibana, …)

New

Data Stream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Zookeeper

Server 1 Server 2 Leader

Pourquoi Mesos Marathon

@hayssams

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

#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

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

#IaaC

Avant Mesos Démultiplication nombre de VMs D

ev.

Int.

PréP

rod.

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

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

#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

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

#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

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

#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

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

#IaaC

Mesos

Tom

cat

Tom

cat

Fron

t fa

cing

App

Fron

t fa

cing

App

Akka Akka

Akka Akka

Stream Processing (Spark Streaming)

Realtime Views (ElasticSearch)

All Data (Spark)

Precompute Views

Batch Views

Query

(Tomcat, K

ibana, …)

New

Data Stream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Marathon Zookeeper

Server 1 Server 2 Leader

Marathon

@hayssams

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

#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

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

#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}"]

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

@YourTwitterHandle #DVXFR14{session hashtag} #IaaC

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

#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

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

@YourTwitterHandle #DVXFR14{session hashtag} #IaaC


Recommended