devoxx france 2015 - intégrer et exploiter le format de données ouvert gtfs. fails et succès, ce...
TRANSCRIPT
@alexiskinsella#DevoxxGTFS
INTÉGRER ET EXPLOITER LE FORMAT DE DONNÉES OUVERT GTFS. FAILS ET SUCCÈS, CE QUI MARCHE ET CE QUI NE MARCHE PAS !
@alexiskinsellaXebia, http://blog.xebia.frAlexis Kinsella
@alexiskinsella#DevoxxGTFS
Plan
1. Présentation
2. Intégration
3. Exploitation
Présentation du standard GTFS
@alexiskinsella#DevoxxGTFS
Signification
General Transit Feed Specification
@alexiskinsella#DevoxxGTFS
Normalisation
Normalisé par en 2005
@alexiskinsella#DevoxxGTFS
Définition
Format commun pour les informations d’horaires de transports publics et données géographiques associées.
@alexiskinsella#DevoxxGTFS
Objectifs
Les flux de données GTFS permettent:
1. Aux agences de transport public de publier leur données.
2. Aux développeurs d’écrire des applications qui les consomment.
@alexiskinsella#DevoxxGTFS
Horaires théoriques
La norme GTFS concerne les données théoriques c’est à dire les horaires planifiés.
@alexiskinsella#DevoxxGTFS
Le format GTFS
Un jeu de données est composé d’une série de fichiers textes (au format CSV) rassemblés au sein d’un fichier zip.
@alexiskinsella#DevoxxGTFS
Horaires temps réel
Le format de données est basé sur protobuf … Oui, c’est :)
La norme GTFS-realtime complète la norme GTFS.
Elle vient amender les données théoriques par des données temps réel.
Le format de données est basé sur protobuf … Oui, c’est Google :)
@alexiskinsella#DevoxxGTFS
Qui ?
Les données GTFS sont fournies par les agences de transport:
…
@alexiskinsella#DevoxxGTFS
Pourquoi ?
Intérêt citoyen
Mouvance Open Data
Volonté politique (Etalab, …)
@alexiskinsella#DevoxxGTFS
Licences
Elles sont multiples …
• Open Database License (ODbL) v1.0• SNCF Open Data• …
Et certaines réservent des surprises !
@alexiskinsella#DevoxxGTFS
Licences
Droit d’audit
Comme prévu à l’article 15, la Communauté urbaine de Lyon dispose d’un droit d’audit sur le système d’information du Licencié.
« Oups ! »
@alexiskinsella#DevoxxGTFS
Disparité de l’accès aux données
Certains jeux de données sont en accès libre …
D’autres sont accessibles après inscription et authentification :/
Pour d’autres, il faut déjà les trouver !
@alexiskinsella#DevoxxGTFS
Disparité des jeux de données
Problèmes d’interprétation de la norme
Maturité des jeux de données assez inégale
Données sous forme de zip … Parfois même un zip
dans un zip …
Un zip dans un zip ?
Intégration de données GTFS
@alexiskinsella#DevoxxGTFS
Facts
Entre 550Mo et 750Mo
Soit entre 11.866.989 et 15.747.594 lignes
@alexiskinsella#DevoxxGTFS
Intégration
Mieux vaut être efficace …
Mais comment intégrer toutes ces lignes ?
@alexiskinsella#DevoxxGTFS
Le temps de l’innocence
+ =
@alexiskinsella#DevoxxGTFS
Le temps de l’innocence
Ok, Google, tu me trouves un script d’import ?
@alexiskinsella#DevoxxGTFS
Avantages
Facile et rapide à mettre en place !
Fonctionne Out of the Box
@alexiskinsella#DevoxxGTFS
Inconvénients
Mais ce n’est pas très rapide tout ça …
@alexiskinsella#DevoxxGTFS
Benchmark simpliste …
Date Node.js MongoDBMongoDB
DriverDurée
Juin 2014
0.10.22 2.6.1 1.3.19 22m41s
@alexiskinsella#DevoxxGTFS
Inconvénients
Ah Oui, Node.js fonctionne sur 1 core …
Dommage ma machine en a 8 !Ah ! Et mongo n’utilise qu’1 seul core pour
écrire !
@alexiskinsella#DevoxxGTFS
Benchmark simpliste …
Au fait, ça donne quoi sur un serveur ?
@alexiskinsella#DevoxxGTFS
Serveur rack 6U ?
@alexiskinsella#DevoxxGTFS
Ou plutôt un Raspberry PI ?
@alexiskinsella#DevoxxGTFS
Benchmark, la suite …
Sur un VPS 3 Cores, 4Go OVH
@alexiskinsella#DevoxxGTFS
Benchmark, la suite …
Environs 55 minutes
@alexiskinsella#DevoxxGTFS
Benchmark, la suite …
Malheureusement, ce n’est pas viable :/
@alexiskinsella#DevoxxGTFS
Benchmark, la suite …
Alors, peut-on faire mieux ?
@alexiskinsella#DevoxxGTFS
Benchmark, la suite
Clusteriser l’import et répartir le travail d’insertion ?
@alexiskinsella#DevoxxGTFS
Benchmark, la suite
Pourquoi pas, mais pas forcement trivial :/
On utilise bien tous les cores mais l’amélioration de performance n’est pas
vraiment au rendez-vous …
ou
Premature optimization
is the root of all evil
@alexiskinsella#DevoxxGTFS
Résultat
Beaucoup de temps perdu …
N’y a-t-il pas plus simple ?
@alexiskinsella#DevoxxGTFS
Benchmark, la suite
Finalement,le vrai point de contention est l’écriture en base de
données
MongoDB occupe le core d’écriture à 100%
@alexiskinsella#DevoxxGTFS
Alternative …
Alors quelle solution ?
@alexiskinsella#DevoxxGTFS
Alternative …
Sharder MongoDB ?
Pas une solution si on a qu’un seul serveur à disposition …
@alexiskinsella#DevoxxGTFS
Alternative …
Réfléchissons à nouveau !
@alexiskinsella#DevoxxGTFS
Alternative …
Relationnel, comme les bases de données SQL ?
GTFS -> Export de données relationnelles …
@alexiskinsella#DevoxxGTFS
Une alternative à MongoDB …
@alexiskinsella#DevoxxGTFS
Des atouts …
• Base de données relationnelle
• Insertion multi cores
• Support géo-spatial fortement amélioré
avec InnoDB en 5.7
• Très bonnes performances
@alexiskinsella#DevoxxGTFS
Des défauts …
• Version 5.7 en Beta
• Support géo-spatial incomplet …
• Création coûteuse des index
@alexiskinsella#DevoxxGTFS
Contourner les défauts
• Créer les index en fin de traitement
• Un schéma par dataset GTFS
• Utiliser la fonctionnalité: LOAD DATA
INFILE !
@alexiskinsella#DevoxxGTFS
Une alternative à Node.js …
Remplacer Node.js par Golang
@alexiskinsella#DevoxxGTFS
Des avantages …
• Ultra performant
• Gestion de la concurrence efficace
@alexiskinsella#DevoxxGTFS
Des inconvénients …
• Un IDE plutôt spartiate
• Un driver MySQL encore jeune
@alexiskinsella#DevoxxGTFS
Le résultat ?
Temps de traitement:
9m10s en local20m15s sur serveur
Index & structures de données complémentaires compris …
Exploitation de données GTFS
@alexiskinsella#DevoxxGTFS
Exploiter les données
Pour en faire quoi ?
@alexiskinsella#DevoxxGTFS
Objectif
Trouver les stations les plus proches d’un point géographique
et afficher les prochains horaires de passage
@alexiskinsella#DevoxxGTFS
Problème
Chercher toutes les informations en base est très
coûteux.
@alexiskinsella#DevoxxGTFS
Problème
Entre 3 secondes et 6 secondes pour une zone
dense dans Paris avec un rayon de 1000 mètres
@alexiskinsella#DevoxxGTFS
Optimisations
Optimiser l’accès aux données ?
Oui, mais comment ?
@alexiskinsella#DevoxxGTFS
Optimisations MySQL
Avec InnoDB, 2 paramètres influent
essentiellement les performances:
• innodb_buffer_pool_size = 6442450944
• max_connections = 512
@alexiskinsella#DevoxxGTFS
Optimisations MySQL
• Travailler la performance des requêtes
• Utiliser des structures de données spécialisées
• Dénormaliser
• Mais surtout …
@alexiskinsella#DevoxxGTFS
MySQL - Types des données
Réécrire les fichiers de données GTFS pour changer les
clés « varchar » ou « char » en clés de type « int »
@alexiskinsella#DevoxxGTFS
Une solution complémentaire ?
Utiliser un cache ?
@alexiskinsella#DevoxxGTFS
Pour quelles données ?
@alexiskinsella#DevoxxGTFS
La solution ?
Mise en place de Redis en tant que cache mémoire
@alexiskinsella#DevoxxGTFS
Problème
Le serveur utilisé dispose de resources mémoire
limitées
@alexiskinsella#DevoxxGTFS
Solution
LevelDB & dérivés
@alexiskinsella#DevoxxGTFS
Solution
SSDB est une base de données en mode client /
serveur compatible avec le protocole Redis !
Replicable & load balançable
Avec un jeux d’instructions compatibles !
@alexiskinsella#DevoxxGTFS
SSDB - Performance
@alexiskinsella#DevoxxGTFS
Le code
Et le code source alors ?
@alexiskinsella#DevoxxGTFS
Node.js & Express
L’API a été codée initialement avec Node.js & Express
Particulièrement intéressant
pour la construction d’API avec Express …
@alexiskinsella#DevoxxGTFS
Node.js - Inconvénients
Néanmoins, Node.js n’aime pas les traitements coûteux en
mémoire et CPU …
Par ailleurs, les différents drivers MySQL apparaissent peu
performants
@alexiskinsella#DevoxxGTFS
Node.js
Après diverses optimisations, les temps de traitement
varient toujours fortement.
Entre 780 ms et 1450 ms, ils restent long et coûteux
@alexiskinsella#DevoxxGTFS
Node.js
Les solutions …
@alexiskinsella#DevoxxGTFS
Node.js
Recoder l’API avec Golang !
@alexiskinsella#DevoxxGTFS
Résultat
Temps de traitement réduits et plus réguliers
entre 550 ms et 770 ms
@alexiskinsella#DevoxxGTFS
Golang - Avantages
Driver MySQL performant
Langage très performant pour la manipulation de
données
@alexiskinsella#DevoxxGTFS
Golang - Inconvénients
Dans un style très impératif,
il est peu adapté à la manipulation de données
@YourTwitterHandle@YourTwitterHandle@alexiskinsella#DevoxxGTFS
Q & A
Pour aller plus loin
@alexiskinsella#DevoxxGTFS
Performances & Structures des données
Améliorer les structures de données
exploitées.
Par exemple: Utiliser une taille fixe des structures de données en
base, pour cela il faut calculer la taille nécessaire à la création des
tables
@alexiskinsella#DevoxxGTFS
Performances & Structures des données
Supprimer les données inutiles ou en doublon
@alexiskinsella#DevoxxGTFS
Base de données
Explorer les capacités de PostgreSQL vs
MySQL
Performance, PostGIS, …
@alexiskinsella#DevoxxGTFS
Fouiller le web
Le web regorge de resources sur le sujet …
GitHub en particulier !
@alexiskinsella#DevoxxGTFS
Quelques sources de données …
• Data.gouv.fr: https://www.data.gouv.fr/fr/search/?q=gtfs
• GTFS Data Exchange :
http://www.gtfs-data-exchange.com/agencies
• Navitia.io : http://navitia.io/datasets
• The Transit App: http://thetransitapp.com/wishlist
@alexiskinsella#DevoxxGTFS
Resources
• Open data stickers: http://upload.wikimedia.org/wikipedia/commons/c/cc/Open_Data_stickers.jpg
• Images de la série South Park, des films Inception & Austin Powers
• http://en.wikipedia.org/wiki/Rage_comic• http://www.iconarchive.com/show/flat-file-type-icons-
by-pelfusion/zip-icon.html• Benchmark du site ssdb.io• Quelques sources inconnues, désolé …