Devoxx france 2015 - Intégrer et exploiter le format de données ouvert GTFS. Fails et succès, ce...

Post on 07-Aug-2015

159 views 1 download

Transcript of Devoxx france 2015 - Intégrer et exploiter le format de données ouvert GTFS. Fails et succès, ce...

@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

Xebia France

http://blog.xebia.fr/

@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é …