SlideShare une entreprise Scribd logo
1  sur  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 ?

Contenu connexe

Tendances

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 HassaniShellmates
 
Comprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleComprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleThierry Gayet
 
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 daysJean-Pierre Vincent
 
Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016François Sarradin
 
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 OCamlStéphane Legrand
 
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 JavascriptNoirdes
 
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 JavaScriptMicrosoft Technet France
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3Eddy RICHARD
 
Les entrées sorties
Les entrées sortiesLes entrées sorties
Les entrées sortiesJihed 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 PHPjulien pauli
 
Plpython et Triggers
Plpython et TriggersPlpython et Triggers
Plpython et TriggersAffinitic
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4julien pauli
 

Tendances (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
 

Similaire à Luigi Paris.py meetup presentation

Rapport des Travaux Pratiques UNIX
Rapport des Travaux Pratiques UNIXRapport des Travaux Pratiques UNIX
Rapport des Travaux Pratiques UNIXSoukaina Boujadi
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniShellmates
 
Introduction au langage Ruby
Introduction au langage RubyIntroduction au langage Ruby
Introduction au langage RubyJulien Blin
 
les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)Souhaib El
 
programmation_shell_2022 (1).pptx
programmation_shell_2022 (1).pptxprogrammation_shell_2022 (1).pptx
programmation_shell_2022 (1).pptxManalAg
 
05 - Cours Fonctions.pptx
05 - Cours Fonctions.pptx05 - Cours Fonctions.pptx
05 - Cours Fonctions.pptxBenacerLeila
 
mis
mismis
misISIG
 
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 lambdaCh'ti JUG
 
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...Normandy JUG
 
0079-cours-linux-base.ppt
0079-cours-linux-base.ppt0079-cours-linux-base.ppt
0079-cours-linux-base.pptAugustoMoundoh1
 
0079-cours-linux-base.ppt
0079-cours-linux-base.ppt0079-cours-linux-base.ppt
0079-cours-linux-base.pptMahdiHERMASSI1
 
Visual studio
Visual studioVisual studio
Visual studioISIG
 

Similaire à 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