Retour d'expérience : Chaînes de production de données

Romain Commandé 2018-04-05

"Code (application ou portion) dont l'objectif est de récupérer de la donnée en entrée (source / input) afin de produire de la nouvelle donnée en sortir (cible) d'après un plan et des règles de transformation définis à l'avance"

Moi                                   

Python

Un outil de choix

  • Très bien outillé pour la production de données
  • Réflexion entièrement basé sur ce que propose Python  nativement
  • On oublie les libs externes (NumPy, Pandas, etc...)

Approche naïve

  • On se rend pas toujours compte que l´on est dans un process de production de données
  • On écrit du code sans trop se poser de question
  • Code pas très lisible
  • Complexité inutile
  • Pas maintenable
  • Don't panic -> Étape obligatoire

Exemple

Du code ! On veut du code !

Le découpage

  • découper son algo en fonction
  • Factorisation des traitements
  • Rentre son code compréhensible au premier coup d’œil
  • Jusqu'où faut-il aller ?

Modèle : les chaînes de production

Chaîne de production

  • Ce qui se fait de mieux pour produire
  • Petites unités de production chaînées entre elles
  • Responsabilité réduite
  • Pas de conscience du reste du process

Les générateurs

Les générateurs

  • Objet itératable basé sur une fonction
  • L’exécution peut être interrompu
  • Renvoyer un résultat intermédiaire
  • yield remplace return

  • On va à la prochaine itération en appelant next() (méthode en Python 2, fonction built-in en Python 3)

Différences

  • Chaines de production inversées (PULL)
  • Streaming : Gérer de gros volumes de données les doigts dans le nez

Exemple

Du code ! Encore du code !

Les coroutines

Les coroutines

  • Connu des Devs Python, rarement utilisées
  • Basées sur les générateurs
  • Envoi de données (PUSH / PULL)
  • Demande un peu de boilerplate (initialisation)
  • Souvent implémentées sous forme de boucles infinies

Exemple

Du code ! On veut du code je te dis !

Une problématique commune

Production de données Mappy

Production de données Vues immersives OUTDOOR

Production de données Ooreka ?

Mise à jour / synchronisation de données

On code !

Spoiler : badaboum !

On code !

  • La gestion est extrêmement complexe
  • Le code que vous avez écrit est ignoble -> premier jet
  • Le debug est ingérable
  • Vous dormez mal la nuit
  • On retravaille le code et l'archi
  • Le nouveau code n'est pas terrible

On fait comment, alors ?

  • On le fait pas !
  • En vrai, on va le faire quand même ;-)
  • On ne va vraiment pas le faire, c'est ce qu'il faut retenir
  • On va se faire aider
  • Disons plutôt, qu'on va aider quelqu'un d'autre à le faire

L'inspiration : Make

Make

  • Commande Unix
  • Compiler une application
  • Source -> binaire
  • Choisi le chemin le plus rapide
  • Ne recompile que ce qui a changé
  • Rien de magique : ce base sur les dates de modification de fichiers

Se faire aider par un plombier

Le "make" de la donnée

  • Application / framework en Python
  • Développé et libérer par Spotify
  • Utilisé en interne
  • Alimentation de clusters Hadoop (stats d'écoute)
  • Gestion de workflow complexe
  • Outil graphique
  • Parallelisme

 

Luigi : Task

  • Unité de calcul
  • Simple classe Python
  • Hérite de luigi.Task
  • Définit des paramètres
  • Chaîné avec d'autres tasks
  • Chaînage static ou dynamic
  • Écrit les données (output) dans une Target

Luigi : Target

  • Simple classe Python
  • Doit avoir une méthode exists()
  • Doit garantir l'atomicité des données

Luigi : invalidation / update

  • Luigi boucle sur toute les tasks
  • Appel la méthode exists() de toutes les targets
  • Relance toutes les tâches non traitées
  • Ne pas supprimer les données intermédiaires
  • Targets menteuses
  • Ne gère pas les changement de code

Exemple

Du code ! On aiiiiiiiiiiiime le code !

Conseils

Retravailler sa chaîne de production en permanence

La granularité est importante

La production de données, c'est du code !

1 bug == 1 test

Ne jamais supprimer de la donnée

Tester le code ET la donnée

Performance VS scalabilité ? SIMPLITÉ !

Des questions ?

Applaudissements !

Chaîne de production de données

By Romain Commandé

Chaîne de production de données

  • 547