Realtime Web avec Kafka, Spark et Mesos

Post on 23-Dec-2014

2,005 views 3 download

Tags:

description

 

transcript

#IaaC

Realtime Web avec Kafka, Spark et Mesos

@hayssams

Hayssam SalehRestreinte à la section de mon intervention

#IaaC

SommaireTo

mca

tTo

mca

t

Fron

t fa

cin

g

Ap

pFr

on

t fa

cin

g

Ap

p

AkkaAkka

AkkaAkka

Stream Processing

(Spark Streaming)

Realtime Views(ElasticSearch)

All Data(Spark)

PrecomputeViews

Batch Views

Qu

ery

(Tom

cat, K

ibana,

…)

New

Data

S

tream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Mesos

MarathonZookeeper

Server 1 Server 2Leader

#IaaC

Objectifs

Spark Streaming

Spark Classic

Kafka

Mesos

Scale Up / Scale Out

@hayssams

#IaaC

Pourquoi Kafka ?

Mesos

Tom

cat

Tom

cat

Fron

t fa

cin

g

Ap

pFr

on

t fa

cin

g

Ap

p

AkkaAkka

AkkaAkka

Stream Processing

(Spark Streaming)

Realtime Views(ElasticSearch)

All Data(Spark)

PrecomputeViews

Batch Views

Qu

ery

(Tom

cat, K

ibana,

…)

New

Data

S

tream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

MarathonZookeeper

Server 1 Server 2Leader

@hayssams

#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

#IaaC

Avec Kafka : partitionnement par clef

U2E3

U2E2

U2E1

U1E3

U1E2

U1E1 U2E

3U2E

2U2E

1U1E

3U1E

2U1E

1

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

#IaaC

Pourquoi Spark Streaming

Mesos

Tom

cat

Tom

cat

Fron

t fa

cin

g

Ap

pFr

on

t fa

cin

g

Ap

p

AkkaAkka

AkkaAkka

Stream Processing

(Spark Streaming)

Realtime Views(ElasticSearch)

All Data(Spark)

PrecomputeViews

Batch Views

Qu

ery

(Tom

cat, K

ibana,

…)

New

Data

S

tream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

MarathonZookeeper

Server 1 Server 2Leader

@hayssams

#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

#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

#IaaC

Avec Spark: Tolérance aux pannes au coût minimumval 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

• 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

#IaaC

Mesos

Tom

cat

Tom

cat

Fron

t fa

cin

g

Ap

pFr

on

t fa

cin

g

Ap

p

AkkaAkka

AkkaAkka

Stream Processing

(Spark Streaming)

Realtime Views(ElasticSearch)

All Data(Spark)

PrecomputeViews

Batch Views

Qu

ery

(Tom

cat, K

ibana,

…)

New

Data

S

tream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

MarathonZookeeper

Server 1 Server 2Leader

Pourquoi Spark Classic

@hayssams

#IaaC

Notification des clientsrdd= 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

#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 groupByKeyreduceByKey

reducecollectcounttakefirstforeach…

• Avec en plus

• Contrôle sur le partitionnement

• broadcast

• accumulateurs

• Les chaînage d’actions ne requiert pas d’écriture intermédiaire sur disque

@hayssams

#IaaC

Mesos

Tom

cat

Tom

cat

Fron

t fa

cin

g

Ap

pFr

on

t fa

cin

g

Ap

p

AkkaAkka

AkkaAkka

Stream Processing

(Spark Streaming)

Realtime Views(ElasticSearch)

All Data(Spark)

PrecomputeViews

Batch Views

Qu

ery

(Tom

cat, K

ibana,

…)

New

Data

S

tream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

MarathonZookeeper

Server 1 Server 2Leader

Pourquoi Apache Zookeeper

@hayssams

#IaaC

Pourquoi Zookeeper

• Election de leader pour la tolérance au pannes

Maitre

EsclaveEsclaveEsclave

Maitre de secoursEsclave et maitre de secours

Esclave et maitre de secours

Esclave et maitre de secours

Esclave et maitre de secours

Election de leader

Avec ZookeeperTout noeud est un master potentiel

@hayssams

#IaaC

Pourquoi Zookeeper• Centralisation de la configuration

/

services

master

nodes

es

node1

node2

node1

Zookeeper

Server 1 Server 2Leader

Service

Service

1.

Enre

gis

trem

en

t des

serv

ices

Client

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

4. sollicitation du service

3. Sélection du worker

@hayssams

#IaaC

Mesos

Tom

cat

Tom

cat

Fron

t fa

cin

g

Ap

pFr

on

t fa

cin

g

Ap

p

AkkaAkka

AkkaAkka

Stream Processing

(Spark Streaming)

Realtime Views(ElasticSearch)

All Data(Spark)

PrecomputeViews

Batch Views

Qu

ery

(Tom

cat, K

ibana,

…)

New

Data

S

tream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

Zookeeper

Server 1 Server 2Leader

Pourquoi MesosMarathon

@hayssams

#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

#IaaC

Avant Mesos Démultiplication nombre de VMs

Dev.

Int.

Pré

Pro

d.

Pro

d.

• 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

#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

#IaaC

Avec Mesos

Serveur Serveur ServeurServeur

80 CPU, 640Go

App

App

App

App

App

App

App

AppApp

• Partage des ressources

• 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

#IaaC

Architecture Mesos

Mesos Master

Mesos Worker Mesos Worker

MonAppScheduler

MonAppExecutorMonAppExecutor

2CPUs, 20Go

Tâche

• Pour s’exécuter sur Mesos une application doit implémenter :

• Un scheduler

• Un Executor

@hayssams

#IaaC

Mesos

Tom

cat

Tom

cat

Fron

t fa

cin

g

Ap

pFr

on

t fa

cin

g

Ap

p

AkkaAkka

AkkaAkka

Stream Processing

(Spark Streaming)

Realtime Views(ElasticSearch)

All Data(Spark)

PrecomputeViews

Batch Views

Qu

ery

(Tom

cat, K

ibana, …

)

New

Data

S

tream

Kafka

Speed Layer

Batch Layer Serving Layer

Product Updates

MarathonZookeeper

Server 1 Server 2Leader

Marathon

@hayssams

#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

#IaaC

Exemple de commande MarathonPOST /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}"]

@YourTwitterHandle#DVXFR14{session hashtag}#IaaC

Sum

mar

y

#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

@YourTwitterHandle#DVXFR14{session hashtag}#IaaC

Q & A