De 20 000 à 4 millions
Khanh Tuong Maudoux
@jetoile
Qui suis-
Khanh Tuong Maudoux
Développeur Java indépendant
blog : http://blog.jetoile.fr
@jetoile
khanh.maudoux@jetoile.fr
3
Contexte Collecteur Stockage Lecture
Traitement
Contexte
5
Contexte
Fonctionnel
Réception de relevés de compteurs (fichiers xml)
Fournir une consolidation (valorisation) des consommations en fonction de différents critères
Algorithmes de lissage et de détection à faire sur les données
Algorithmes de valorisation à faire sur les données
Contexte
Volumétrie
7
Avant :
20.0000 clients
Cible :
4.000.000 clients
~ 3.000.000 fichiers par jours (~156 Go/jour)
Avec un pas de 30 minutes !
Contexte
État des lieux
Algorithmes de lissage et de détection fait au moment de la collecte
long »
=> anomalies « courantes »
Algorithmes de consolidation exécutés par batch sur les données
stockées
Contexte
État des lieux
9
Stockage TimeSeries Data
Data Data
Data
Collecteur Consolidation Applicatif
Stockage
Stockage
Contexte
État des lieux
Contexte
Objectifs
11
Objectif :
Remplacer la solution de stockage
Ne pas oublier la phase le ré-import totale! (~3 ans de données)
Collecteur
Collecteur
Objectifs
13
Batch de collecte avec stockage dans une solution propriétaire
Objectifs :
Valider différentes solutions (Cassandra, MySQL Cluster) Valider le modèle de données
Collecteur
État des lieux
Stockage Data
Data Data
Data
Transformation Objet pivot
Routage par xpath Transformation Objet pivot
Data XML
Data XML
Transformation JAXBTransformation JAXB
Data Java
Data Java
Data DTO
Data DTO
Collecteur
Pistes
15
Pistes :
Spring Batch EIP
Spring Batch + EIP
Collecteur
Outils / Framework :
Spring Integration Metrics
JMX / Jolokia Hawt.io
Maven!
Collecteur
17
Spring Integration
Architecture « Pipe and Filters »
Collecteur
Stockage Data
Data Data
Data
Transformation Objet pivot
Routage par xpath Transformation Objet pivot
Data XML
Data XML
Transformation JAXBTransformation JAXB
Data Java
Data Java
Data DTO
Data DTO
Spring Integration
Collecteur
19
Spring Integration
Collecteur
Spring Integration
Collecteur
21
Spring Integration
Collecteur
Spring Integration
Collecteur
23
Spring Integration
Collecteur
Spring Integration
Message-history
Scalabilité horizontale
Collecteur
25
Metrics
Collecteur
Jolokia
JMX via HTTP/JSON
Collecteur
27
Hawt.io
Collecteur
Maven
maven-jaxb2-plugin (org.jvnet.jaxb2.maven2)
appassembler-maven-plugin (org.codehaus.mojo)
Collecteur
29
endpoint REST pour injection
Stockage
Stockage
Objectifs
31
Rappels :
Remplacer la solution existante de stockage
Chaque capteur remonte une donnée toutes les 30 minutes Time series (au plus 50 000 colonnes par ligne)
Stockage
Cassandra
Base de données orientée colonnes
Keyspace
Column Family Column
Stockage
33
Cassandra
Time series : 1 ligne avec de multiples colonnes (clé composite)
CREATE TABLE capteur (
capteur_id text, event timestamp, temperature text,
PRIMARY KEY (capteur_id, event) )
Ordonnée
capteur_id event temperature
event temperature
Stockage
34
Attention longueur/taille de ligne
CREATE TABLE capteur ( capteur_id text,
event_period text, event timestamp, value text,
PRIMARY KEY ((capteur_id, event_period), event)
Attention modélisation )
aggrégation
Stockage
35
Jolokia
Comme agent sur la JVM
Lecture
Lecture
Objectifs
37
Évaluer la pertinence de la solution de stockage Véloce
Simple
Remonté de métriques
=> injecteur !
Lecture
Pistes
Pistes :
From scratch
Lecture
39
Outils / Framework :
RestEasy Netty Swagger
JMX / Jolokia Hawt.io
Maven
Gatling / AB
Lecture
RestEasy Netty :
JAX-RS Netty Simple
Lecture
41
Swagger :
Lecture
Jolokia
Lecture
43
Gatling
Traitement
Traitement
Rappel
45
Stockage TimeSeries Data
Data Data
Data
Collecteur Consolidation Applicatif
Stockage
Stockage
Traitement
Objectifs
Objectif :
Collecte
Rapide
Pas de pertes de données (sécurisation de la données)
Détection des données fausses
Faite en aval de la collecte
Consolidation
Faite sur les données « valides » avec stockage des mesures dans des « batch View » Séparation des concepts !
Traitement
Objectifs
47
Objectif :
Lambda architecture Query = function (all data)
Traitement
Objectifs
Objectif :
Query = function (all data)
Service Layer Batch Layer
Data Data
Data Data
collecte
C*
Transformation Objet pivot C*DAO Valo
C*
C*
transformation
All datas Precompute views Batch views
Traitement
49
Spark / Hadoop
Traitement
Objectifs ?
Volumétrie non acceptable pour la production :
Duplication de la donnée
Souhaite une solution avec calcul à la demande
Traitement
Objectifs ?
51
Traitement
Service Layer
Data Data
Data Data
collecte
C*
Transformation Objet pivot C*DAO Valo
C*
C*
transformation
All datas Precompute views Batch views
Traitement
Objectifs ?
Algorithme de lissage en amont
53
Conclusion
Merci !
Questions ?
55