SlideShare una empresa de Scribd logo
1 de 20
Moi
~2 ans de python
Full Stack dev chez AlephD
jonasbru.com
DATA PIPELINES MADE EASY
Le problème
Des scripts...
...qui dépendent du résultat d’autres scripts
...qui dépendent eux aussi d’autres scripts
...qui dépendent des données d’un service externe
...qui plante une fois sur trois
...le tout lancé depuis douze CRON
$> pip install luigi
Luigi à la rescousse
Luigi s’occupe..
..de gérer les dépendances entre les tâches
..de gérer la reprise en cas d’erreur
..d'éviter d’avoir des tâches qui tournent en double
..de visualiser l’état de tout ça
Luigi à la rescousse.. mais pas trop
Il ne va pas..
..lancer les tâches
..repartir les tâches sur votre cluster
..faire le café
La base
Task & Target
Task
Task == N’importe quoi
Trois méthodes à implémenter :
requires() --> Task
run()
output() --> Target
Target
Target == Un résultat d’une tâche
un fichier sur disque
..ou une partition HDFS
..ou une ligne dans votre BDD
..ou n’importe quoi qui implémente exists() --> bool
Example time!
Mail journalier des chansons les + écoutés
Télécharger la
liste des chansons
écoutées
Calculer le top 10 Envoyer le mail
class DownloadSongs(luigi.Task):
date = luigi.DateParameter()
def output(self):
return luigi.LocalTarget(self.date.strftime('songs_%Y_%m_%d.tsv'))
def run(self):
song_list = get_songs(self.date) # api call
with self.output().open('w') as out_file:
for song in song_list:
out_file.write('{}n'.format(song))
Télécharger la
liste des chansons
écoutées
Calculer le top 10 Envoyer le mail
class TopTen(luigi.Task):
date = luigi.DateParameter()
def requires(self):
return DownloadSongs(date=self.date)
def output(self):
return luigi.LocalTarget(self.date.strftime('top_%Y_%m_%d.tsv'))
def run(self):
top = []
with self.input().open('r') as in_file:
top = Counter(in_file.readlines()).most_common(10)
with self.output().open('w') as out_file:
for song, count in top:
out_file.write('{}t{}n'.format(song, count))
Télécharger la
liste des chansons
écoutées
Calculer le top 10 Envoyer le mail
class SendMailTopSongs(luigi.Task):
date = luigi.DateParameter()
def requires(self):
return TopTen(date=self.date)
def run(self):
with self.input().open('r') as top_ten_file:
send_email(top_ten_file)
Télécharger la
liste des chansons
écoutées
Calculer le top 10 Envoyer le mail
Et pour lancer tout ça..
$> python topSongs.py SendMailTopSongs --date 2015-12-09
Mieux dans un CRON
*/10 * * * * python topSongs.py SendMailTopSongs --days 10
Central Scheduler
Organise et coordonne les différents workers
Une tâche n’est lancée qu’une seule fois
Central Scheduler
Et bien plus !
Très bien intégré à Hadoop
Multiprocessing basique
Gestion des priorités
Ressources
Code simple
Mainteneurs très actifs
Des questions ?

Más contenido relacionado

La actualidad más candente

Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Shellmates
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
Jean-Pierre Vincent
 
Les entrées sorties
Les entrées sortiesLes entrées sorties
Les entrées sorties
Jihed Kaouech
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
julien pauli
 
Plpython et Triggers
Plpython et TriggersPlpython et Triggers
Plpython et Triggers
Affinitic
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4
julien pauli
 

La actualidad más candente (13)

Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El Hassani
 
Php cours
Php coursPhp cours
Php cours
 
Comprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleComprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractible
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016
 
La programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCamlLa programmation fonctionnelle avec le langage OCaml
La programmation fonctionnelle avec le langage OCaml
 
Good or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en JavascriptGood or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en Javascript
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
 
Les entrées sorties
Les entrées sortiesLes entrées sorties
Les entrées sorties
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Plpython et Triggers
Plpython et TriggersPlpython et Triggers
Plpython et Triggers
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4
 

Similar a Luigi Paris.py meetup presentation

Introduction au langage Ruby
Introduction au langage RubyIntroduction au langage Ruby
Introduction au langage Ruby
Julien Blin
 
mis
mismis
mis
ISIG
 
Visual studio
Visual studioVisual studio
Visual studio
ISIG
 

Similar a Luigi Paris.py meetup presentation (20)

Rapport des Travaux Pratiques UNIX
Rapport des Travaux Pratiques UNIXRapport des Travaux Pratiques UNIX
Rapport des Travaux Pratiques UNIX
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Ruby Pour RoR
Ruby Pour RoRRuby Pour RoR
Ruby Pour RoR
 
Introduction au langage Ruby
Introduction au langage RubyIntroduction au langage Ruby
Introduction au langage Ruby
 
Boot
BootBoot
Boot
 
s de base
s de bases de base
s de base
 
les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)
 
programmation_shell_2022 (1).pptx
programmation_shell_2022 (1).pptxprogrammation_shell_2022 (1).pptx
programmation_shell_2022 (1).pptx
 
05 - Cours Fonctions.pptx
05 - Cours Fonctions.pptx05 - Cours Fonctions.pptx
05 - Cours Fonctions.pptx
 
Présentation de data.table
Présentation de data.tablePrésentation de data.table
Présentation de data.table
 
mis
mismis
mis
 
Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambda
 
Tp n 5 linux
Tp n 5 linuxTp n 5 linux
Tp n 5 linux
 
cours-Linux.PPT
cours-Linux.PPTcours-Linux.PPT
cours-Linux.PPT
 
Snort implementation
Snort implementationSnort implementation
Snort implementation
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
0079-cours-linux-base.ppt
0079-cours-linux-base.ppt0079-cours-linux-base.ppt
0079-cours-linux-base.ppt
 
0079-cours-linux-base.ppt
0079-cours-linux-base.ppt0079-cours-linux-base.ppt
0079-cours-linux-base.ppt
 
Visual studio
Visual studioVisual studio
Visual studio
 

Luigi Paris.py meetup presentation

  • 1.
  • 2. Moi ~2 ans de python Full Stack dev chez AlephD jonasbru.com
  • 4. Le problème Des scripts... ...qui dépendent du résultat d’autres scripts ...qui dépendent eux aussi d’autres scripts ...qui dépendent des données d’un service externe ...qui plante une fois sur trois ...le tout lancé depuis douze CRON
  • 5.
  • 7. Luigi à la rescousse Luigi s’occupe.. ..de gérer les dépendances entre les tâches ..de gérer la reprise en cas d’erreur ..d'éviter d’avoir des tâches qui tournent en double ..de visualiser l’état de tout ça
  • 8. Luigi à la rescousse.. mais pas trop Il ne va pas.. ..lancer les tâches ..repartir les tâches sur votre cluster ..faire le café
  • 9. La base Task & Target
  • 10. Task Task == N’importe quoi Trois méthodes à implémenter : requires() --> Task run() output() --> Target
  • 11. Target Target == Un résultat d’une tâche un fichier sur disque ..ou une partition HDFS ..ou une ligne dans votre BDD ..ou n’importe quoi qui implémente exists() --> bool
  • 12. Example time! Mail journalier des chansons les + écoutés Télécharger la liste des chansons écoutées Calculer le top 10 Envoyer le mail
  • 13. class DownloadSongs(luigi.Task): date = luigi.DateParameter() def output(self): return luigi.LocalTarget(self.date.strftime('songs_%Y_%m_%d.tsv')) def run(self): song_list = get_songs(self.date) # api call with self.output().open('w') as out_file: for song in song_list: out_file.write('{}n'.format(song)) Télécharger la liste des chansons écoutées Calculer le top 10 Envoyer le mail
  • 14. class TopTen(luigi.Task): date = luigi.DateParameter() def requires(self): return DownloadSongs(date=self.date) def output(self): return luigi.LocalTarget(self.date.strftime('top_%Y_%m_%d.tsv')) def run(self): top = [] with self.input().open('r') as in_file: top = Counter(in_file.readlines()).most_common(10) with self.output().open('w') as out_file: for song, count in top: out_file.write('{}t{}n'.format(song, count)) Télécharger la liste des chansons écoutées Calculer le top 10 Envoyer le mail
  • 15. class SendMailTopSongs(luigi.Task): date = luigi.DateParameter() def requires(self): return TopTen(date=self.date) def run(self): with self.input().open('r') as top_ten_file: send_email(top_ten_file) Télécharger la liste des chansons écoutées Calculer le top 10 Envoyer le mail
  • 16. Et pour lancer tout ça.. $> python topSongs.py SendMailTopSongs --date 2015-12-09 Mieux dans un CRON */10 * * * * python topSongs.py SendMailTopSongs --days 10
  • 17. Central Scheduler Organise et coordonne les différents workers Une tâche n’est lancée qu’une seule fois
  • 19. Et bien plus ! Très bien intégré à Hadoop Multiprocessing basique Gestion des priorités Ressources Code simple Mainteneurs très actifs