Chtijug springbatch 2011
-
Upload
olivier-bazoud -
Category
Technology
-
view
1.394 -
download
3
description
Transcript of Chtijug springbatch 2011
Spring BatchMardi 29 Novembre 2011
Ch’ti JUG
Olivier Bazoud
Julien Jakubowski
Le mot du sponsorde cette session
Ekino / @3k1n0• Conception, développement et
maintenance de dispositifs digitaux• 150 personnes
– 50% de développeurs, 0% de régie• Digital
– Mobile + HTML + RIA– JAVA + PHP + .NET
• 6 pôles de compétences, 25 clients, 50 projets/an = 1 équipe
Duchess France
Duchess France - Présentation
Ce qu'est le JDuchess ...
Et ce qu'il n'est pas !
Duchess France - L'équipe
@MathildeLemee
@agnes_crepet
@dijouxellenne
@karesti
@Zazoun
@cfalguiere
@Audrey_Neveu
Duchess France - Objectifs
… Et les inciter à participer aux conférences
Avoir une visibilité des femmes dans l'IT ...
Duchess France - Les Actions
Duchess France - En chiffre
70 membres
60 membres
+ de 700 followers
Duchess France - Nous suivre
http://jduchess.org/duchess-france/
duchessfr
@duchessfr
Merci de votre attention !
• http://lille.startupweekend.org
Spring BatchMardi 29 Novembre 2011
Ch’ti JUG
Olivier Bazoud
Julien Jakubowski
IntervenantsOlivier Bazoud @obazoud, Ekino @3k1n0
ISEN (Toulon)
Architecte technique
Java EE / Spring, Spring Batch, NoSQL, Node.js
Co-auteur de « Spring Batch in Action »
Spring User Group France
Julien Jakubowski, @jak78, OCTO TechnologyISEN (le vrai, de Lille)
Architecte technique
Spécialisé Java EE / Spring
Ch'ti JUG, Agile Tour Lille
De quoi va-t-on parler ce soir ?
• On va parler de batchs en Java
• … et aussi de bière
http://www.flickr.com/photos/fromeyetopixel/2559391584/
Nos objectifs
En sortant de la salle, vous :
Savez identifier certains problèmes récurrents avec les batchs écrits en Java
Savez si Spring Batch est utile pour vous (ou pas)
Avez intégré les notions principales
… et quelques notions avancées
Pouvez faire un batch « Spring Batch » demain
Ce qui vous attend• Batch : de quoi parle-t-on ?• Pourquoi Spring Batch ?• Faisons ensemble un batch...
– Introduction progressive des notions de Spring Batch
• Retours d'expérience• Forces et faiblesses• Notions avancées - vote• Questions / Réponses
Batch : de quoi parle-t-on ?
Batch processing = répétition de traitements sur un ensemble de données…
Batch : de quoi parle-t-on ?
… potentiellement grands volumes…
http://www.flickr.com/photos/claudiasofia99/2878579560/
Batch : de quoi parle-t-on ?
… sans intervention d’un utilisateur humain – pas d’interface homme-machine
Batch : de quoi parle-t-on ?
Exemples:• Import flat / XML dans une base de données• Mise à jour de données de référentiel• Intégration de flux financiers dans un SI• …
Batch : de quoi parle-t-on ?
Un batch n’est pas un scheduler• Cron, inotify, Quartz, $U…• Mais un scheduler peut le lancer
Beer Batch
• Caractéristiques :– Lire le fichier XML de recettes, au format BeerXML– Ecrire les recettes en base de données– Filtrer certaines recettes et créer un fichier de rejets
Problèmes récurrents• Fiabilité
Problèmes récurrents• Maintenabilité
Problèmes récurrents• Réinvention de la roue… carrée
Quand j’écris une application web…
Quand j’accède à une base de données…
Et quand j’écris un batch ?
http://www.flickr.com/photos/crystaljingsr/3914729343/sizes/o/in/set-72157622354789320/
Je suis… à poil ?
Et quand j’écris un batch ?
Spring Batch offre pourtant une solution pour vous guider lors de l’écriture de vos batchs en Java
Spring Batch propose…
• Un cadre• Un vocabulaire (domain language)• Traitement par lots (grands volumes de
données)• Gestion des transactions• Flow, reprise sur erreur• Spring dans ses batchs
Parallélisme
PartitionnementSpring Batch Admin
Spring Batch
Notions de base
BeerBatch V2• Ecrire la date de début du batch• Lire le fichier XML de recettes, au format BeerXML• Filtrer certaines recettes et créer un fichier de rejets• Ecrire en base de données
Spring Batch
Schéma du batch
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemWriterItemProcessor
Tasklet
RecipeStep
InitialStep
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
InitialTasklet
Tasklet
• Besoin– Effectuer une tâche unitaire
• Exemples– Supprimer un répertoire et son contenu– Unzip d’un fichier– Appel d’une procédure stockée– Appel d’un web service
Morceaux de code
ItemReader
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemWriterItemProcessorItemReader
ItemReader• Besoin
– Lire le XML de recettes
• ItemReader– Fournit des items en entrée
<xml>
123;AB;456;CD;
SELECT ... FROM ...
Morceaux de code
ItemProcessor
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemWriterItemProcessor
ItemProcessor• Besoin
– Transforme, valide et / ou filtre une recette
• ItemProcessor– Transforme un item en un autre– Filtrer ou rejeter un item– Emplacement pour les « règles métier »
Morceaux de code
Morceaux de code
ItemWriter
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
ItemWriter• Besoin
– Décharge les bières dans une base SQL
• ItemWriter– Ecrit les items
<xml>
123;AB;456;CD;
INSERT... INTO ...
Morceaux de code
Chunk
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
Chunk
• Besoin– Lire, transformer et écrire
• Chunk– Lire et transformer les données successivement– Ecrire le lot de données– Le commit-interval définit la taille du lot (différent de la taille du
fichier)– Gestion de la transaction : Commit/Rollback
Chunk
Traitement par lots
Morceaux de code
Listener
RecipeStep
InitialStep
InitialTasklet
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
Listener
• Besoin– Création d’un fichier de rejet
• Listener– Etre à l’écoute des évènements du batch
Morceaux de code
Morceaux de code
Morceaux de code
Step
RecipeStep
InitialStep
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
InitialTasklet
Step
• Besoin– Etape dans le processus du batch– Contrôle le workflow
Job
RecipeStep
InitialStep
Chunk oriented tasklet
ItemReader ItemProcessor ItemWriter
InitialTasklet
Job
• Besoin– Décrire les étapes du batch– Composé d’un ou plusieurs steps
Spring Tools Suite
Morceaux de code
Lancer un job directement
Lancer un jobvia un scheduler
On utilise ici Spring Scheduler.Il est indépendant de Spring Batch
Lancer un jobvia un scheduler
Tests
• Tests unitaires facilités via le découpage Spring Batch– writers, processors etc...
• Tests d'intégration facilités par Spring– @RunWith– Step, Job
Morceaux de code
Morceaux de code
Forces et faiblesses
✔Fiabilité et bons patterns✔Tests unitaires et d'intégration, TDD✔Batchs complexes mieux maintenables✔Bénéficie de fonctions avancées à moindre coût✔ ...the Spring way, intégration à Spring✔Productivité, à terme...✗… après avoir payé le ticket d'entrée
Retour d’expérience Ekino
• Framework de batch– Moins de code produit, moins d'erreurs possibles– Plus de tests unitaires + intégrations
• Mise en place par l'exemple– J'ai fait le premier batch pour montrer la voie– Un même vocabulaire aide à se comprendre
• Répond à nos besoins même si les batchs sont différents au niveau métier
Retour d’expérience Ekino
• Nos batchs « Spring Batch » sont en SQL plutôt qu'en Hibernate
• Spring Batch s'occupe de la gestion transactionnelle
• En moyenne – 15% - 50% de gain sur le temps de développement– 15% - 50% de gain au « runtime »
• Gains plus impressionnants sur certains cas– XML 100Mo + SQL; Gain : de 60 mn à 8mn– 10 fichiers 4Mo + SQL; Gain : de 10mn à 1mn30s
Des questions,avant la suite ?
http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
Spring BatchAllons plus loin
Maître détailRecipe
HopHopHop
R;Burton Ale;All Grain;Brad SmithH;Goldings, East Kent;United KingdomH;Northern Brewer;GermanyH;Fuggles;United KingdomENDR;Dry Stout;All Grain;Brad SmithH;Fuggles;United KingdomEND
Un batch plus robuste reprise sur erreurs
Flow
Step A
Step B
Scaling et parallélisme
http://www.flickr.com/photos/claudiasofia99/2878579560/
Spring Batch et Hibernate
Spring Batch Admin
Allons plus loin…Au choix!
• Un cas un peu plus complexe – maître détail
• La reprise sur erreurs• Un batch qui n’a pas un flow de
bisounours…• Scaling et parallélisme• Spring Batch et Hibernate• Spring Batch Admin
Maître détail
R;Burton Ale;All Grain;Brad SmithH;Goldings, East Kent;United KingdomH;Northern Brewer;GermanyH;Fuggles;United KingdomENDR;Dry Stout;All Grain;Brad SmithH;Fuggles;United KingdomEND
Maître détail
RecipeStep
Chunk oriented tasklet
ItemReader ItemWriterItemProcessor
Maître détailDéclaration du Job
Maître détailDéclaration du reader custom
R;Burton Ale;All Grain;Brad SmithH;Goldings, East Kent;United KingdomH;Northern Brewer;GermanyH;Fuggles;United KingdomENDR;Dry Stout;All Grain;Brad SmithH;Fuggles;United KingdomEND
Maître détailDéclaration du reader délégué
A retenir
• Implémentation de notre propre reader• Ré-utilisation d’un reader déjà fourni par
Spring Batch• Ré-utilisation de ce que nous avons déjà
codé précédemment
Un batch plus robuste
Reprise sur erreur
• Un batch plus robuste (tolérant à l’erreur) c’est un batch :– Qui survit à quelques données invalides– Qui survit à une indisponibilité– Qu’on est en mesure de relancer
Reprise sur erreur
• Spring Batch out-of-the-box propose:– Sauter les erreurs non bloquantes (skip)– Recommencer un traitement (retry)– Déterminer si le batch est fini (completion)– Redémarrer un batch (restart)
Reprise sur erreur
Reprise sur erreur: Skip
• Ne pas arrêter le batch si la lecture/process/écriture échoue
• Personnaliser les cas de « skip »• Ecouter les cas de « skip »
0001;ABC;DEF;0002;ABC;DEF;000zxjgxdjghjsdfkud0004;ABC;DEF;
Reprise sur erreur: Skip
– Si FlatFileException, Spring Batch skip l’item– Skip de 10 items max– Au-delà la step « failed »– Include/Exclude possible
Reprise sur erreur: Skip
• Personnaliser la gestion du « skip »• Par défaut: LimitCheckingItemSkipPolicy
Reprise sur erreur: Skip
• Configuration de la gestion du « skip »
Reprise sur erreur: Skip
• Un listener permet de traiter les items écartés
• Les annotations existent aussi– @OnSkipInRead– @OnSkipInWrite– @OnSkipInProcess
Reprise sur erreur: Retry
Reprise sur erreur: Retry
http://www.libertaland.com/2011/04/une-femme-de-75-ans-coupe-tout-linternet-en-armenie/
Reprise sur erreur: Retry
• Permet de relancer une opération si indispo temporaire
• Personnaliser les cas de « retry »• Ecouter les cas de « retry »
Reprise sur erreur: Retry
– Si DLDAE, Spring Batch recommence– Retry 3 fois max– Au-delà la step « failed »– Include/Exclude possible
Reprise sur erreur: Retry
• Personnaliser le « retry »: RetryPolicy– SimpleRetryPolicy (défaut)
• Stratégie entre 2 « retry »: BackoffPolicy– NoBackOffPolicy (défaut)– ExponentialBackOffPolicy vraiment utile
Reprise sur erreur: Retry
• Configuration de la gestion du « retry »
Reprise sur erreur: Retry
• Un listener permet de traiter les « retry »
Reprise sur erreur: Retry
• Pour les tasklets– RetryTemplate– RetryOperationsInterceptor avec de l’AOP
Reprise sur erreur: Restart
Reprise sur erreur: Restart
• Même avec skip/retry, un batch peut planter
• Il reste encore une solution • Nous pouvons redémarrer le batch
Reprise sur erreur: Restart
• Indique si le job est « restartable »
• Indique le nombre max de « restart »
Reprise sur erreur: Restart
• La step est démarrée lors du restart même si elle a été terminée correctement
Reprise sur erreur: Restart
• Comment reprendre en plein milieu d’un chunk ?
• Comment Spring Batch sait il où reprend ?
Reprise sur erreur: Restart
• Spring batch stocke des méta data
Reprise sur erreur: Restart
• Spring Batch persiste régulièrement les « ExecutionContext »
• Ceci permet à Spring Batch de savoir où reprendre
• C’est ce qui fait qu’un batch est « restartable »
Reprise sur erreur: Restart
• Si vous voulez que vos Reader/Writer custom soient restartables, vous devez les concevoir restartables!
• Certains fournis par Spring Batch le sont, mais pas tous
• Ce n’est pas toujours possible – ex: Writer JMS.
Reprise sur erreur: Restart
• ItemStream
Reprise sur erreur: Restart• Exemple de Reader « restartable »
Reprise sur erreurConclusion
• Nous avons appris comment:– Ecarter des items défectueux (skip)– Recommencer une step s’il y a une erreur
temporaire (retry)– Implémenter notre propre stratégie de
« skip » et « retry »– Redémarrer un job avec certains steps
Gestion du flow
Gestion du flow
Le « batch bisounours »
Step A
Step B
Gestion du flow
Exemple
Gestion du flow
Exemple
Gestion du flow• Le « batch complexe»
Step
Step
Step
Step
Step
Step
Step
Step
Step
Gestion du flow
• Comment…– faire des flows non linéaires– piloter l’enchaînement des steps– passer des données entre steps
Gestion du flow
• Exemple plus simple ;)
StepA
StepB
StepAlertFAILED
*
Gestion du flow
Gestion du flow
• Batch Status– Etat du job / step en cours d’exécution
• Exit Status– Etat du job ou step après son exécution– C’est lui qui détermine le flow
• Exemple– COMPLETED, STARTING, STARTED,
STOPPING, STOPPED, FAILED,ABANDONED or UNKNOWN
– C?T (CAT mais pas COUNT), C*T (CAT et COUNT)
Gestion du flow
• Créer et utiliser ses propres « exit status » – StepExecutionListener– JobDecider
Gestion du flow
• Utiliser ses propres « exit status »
StepA
StepB
StepC
COMPLETED WITH SKIPS
*
Gestion du flow
• « exit status » + StepExecutionListener
Gestion du flow• Configuration
Gestion du flow
• « exit status » + JobExecutionDecider
Gestion du flow• Configuration
Gestion du flow
• « StepExecutionListener » ou « JobExecutionDecider » ?
• JobExecutionDecider pour réutiliser plus facilement la logique de branchement
Gestion du flow
• Encore plus de contrôle: end, fail
Gestion du flow
• Partager des informations entre les steps– À la Spring:bean classic– A la Spring Batch: « Execution context »
• 1 pour le Job et 1 par Step• C’est une Map sauvegardé dans les meta data• Attention au volume• Late bindings
– #{jobExecutionContext[‘myKey']}
Gestion du flow
• Accès à ExecutionContext
Gestion du flow
• Configuration
Gestion du flow
• Mutualiser les flowsStep A
Step B
Step C
Step D
MonFlow
Gestion du flow• Configuration
Gestion du flow• Réutiliser un Job
Gestion du flow
• Conclusion, nous avons– Fait des flows non linéaires– Piloté l’enchaînement des steps– Passé des données entre steps– Mutualisé et réutilisé des jobs
Scaling
http://www.flickr.com/photos/claudiasofia99/2878579560/
Scaling
• Différentes stratégies possibles– Multi-threaded Step (single process)– Parallel Steps (single process)– Remote Chunking of Step (multi process)– Partitioning a Step (single or multi process)
Spring Batch in Action
http://www.manning.com/templier
Liens• Spring User Group Paris
– http://groups.google.fr/group/sugfr
• Le code de la présentation– https://github.com/obazoud/spring-batch-sug
• Spring Batch 2.1.x– http://static.springsource.org/spring-batch
• Articles sur le web– http://www.theserverside.com/news/1363855/Spring-Batch-Overview– http://www.infoq.com/presentations/syer-introducing-spring-batch– http://blog.zenika.com/index.php?post/2010/03/05/To-batch-or-not-to-
batch– http://blog.octo.com/spring-batch-par-quel-bout-le-prendre/
Questions ?
http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/
Quizz
Quizz 1
Ce que n'est pas Spring Batch ?
1. un framework orienté batchs
2. un scheduler
3. un framework open source
Quizz 2
Qui est le principal leader du projet Spring Batch ?
1. Antonio Goncalves
2. Obi-wan Kenobi
3. Dave Syer
Quizz 3
Comment s'appelle le format standard de description de recette de bière ?
1. BeerXML
2. ISO-1664
3. ChtixML
Quizz 4
Qui vous offre un exemplaire de « Spring Batch in Action »?
1. Sais pas, je viens de me réveiller
2. Ekino
3. Chubaka
Quizz 5
Comment s'appelle la console d’admin de Spring Batch ?
1. Coldfusion Web Console
2. Spring Batch Admin
3. PlayScala
Quizz 6
Qui vous offre le buffet de cette session ?
1. Sais pas, je viens de me réveiller (mais c’est vrai qu’il fait faim!)
2. Linus Torvald
3. Ekino
ROTI
http://www.flickr.com/photos/34943981@N00/202923614/
Session « Spring Batch »
• Ekino– http://www.ekino.com / @3k1n0– Olivier Bazoud @obazoud
• Octo Technology– http://www.octo.com / @ OCTOTechnology– Julien Jakubowski @jak78
Spring Batch et Hibernate
Spring Batch et Hibernate
• Raison d’utiliser Hibernate avec Spring Batch: code existant rapidité de développement
• Ca ne se fait pas sans dangers…
Spring Batch et Hibernate
• Overhead de Hibernate sur JDBC
• Hibernate est stateful (par défaut)– 1M d’items lus = 1M maintenus en RAM
OutOfMemoryError
Spring Batch et Hibernate
Correctifs possibles pour pb stateful:
• Ne pas faire d’Hibernate ;-)
• Utiliser HibernateCustomItemReader– Session stateless
• Ajuster le commit interval
Spring Batch et Hibernate
• OK je suis un bon élève, j’utilise HibernateCursorItemReader
• Maintenant, je fonce…
• Mais attention au select N+1
Spring Batch et Hibernate
• Pattern: « Driving Query Based ItemReaders »
• Certaines bases de données (ex: DB2)– Pessimitic looking– Ouverture de curseurs sur des données
importantes• Bonne pratique avec Hibernate• Prévient les LazyException
Spring Batch et Hibernate
• Principe– Le reader lit les ids via SQL
• Select id from XXX where …
– Le premier ItemProcessor transforme l’id en objet via Hibernate par exemple
– Les autres processors font les traitements métiers
– …
Spring Batch Admin
• Console Web pour Spring Batch– « Standalone » ou « Embedded »– API Rest– Uploader une nouvelle configuration– Uploader un fichier à traiter
• « Customisable »– Base de données, Branding, UI, ..
• Monitorer les batchs
Spring Batch Admin
• API REST
Spring Batch Admin
$ curl –s http://localhost:8080/spring-batch-admin-sample/jobs.json
{ "jobs": { "resource": "http://localhost:8080/spring-batch-admin-sample/jobs.json", "registrations": { "infinite": { "name": "infinite", "resource": "http://localhost:8080/spring-batch-admin-sample/jobs/infinite.json", "description": "No description", "executionCount": 0, "launchable": true, "incrementable": false }, "job1": { "name": "job1", "resource": "http://localhost:8080/spring-batch-admin-sample/jobs/job1.json", "description": "No description", "executionCount": 0, "launchable": true, "incrementable": true …
Spring Batch Admin
• Les jobs
Spring Batch Admin
• Lancement / Historique d’un job
Spring Batch Admin
• Lancer un job
Spring Batch Admin
• Détail d’un job execution
Spring Batch Admin• Détail d’éxécution
Spring Batch Admin / Monitoring
• JMX / MBean– BatchMBeanExporter
• Exporter un jobService• Voir les métriques des « Job/Steps Executions »
– SLA StepExecutionServiceLevelMonitor• Permet de recevoir des notifications JMX si une
Step met trop de temps
• Utilisable aussi en Standalone
Spring Batch Admin / Monitoring
Spring Batch Admin / Monitoring
Scaling
http://www.flickr.com/photos/claudiasofia99/2878579560/
Scaling
Scaling
• Différentes stratégies possibles– Multi-threaded Step (single process)– Parallel Steps (single process)– Remote Chunking of Step (multi process)– Partitioning a Step (single or multi process)
Scaling
• Multi-threaded Step– Une Step est multi threaded
• Parallel Steps– Les Steps sont exécutées en parallèle
• Remote Chunking of Step– Distribution des chunks
• Partitioning a Step– Partage les données à travers les noeuds
Scaling: Multi-threaded Step
– Multi thread au niveau « Step »– Utilise un ThreadPoolTaskExecutor– Chaque thread construit un chunk– Les readers/writers sont thread-safe ?
• La plus part non, ils sont stateful
– « Process Indicator Pattern »• Lire les items ‘processed’ = false• Un ItemProcessor met ‘processed = true’
Scaling: Multi-threaded Step
Scaling: Step en parallèle
• Executer plusieurs Step en parallèle• Mot clé « split » dans la configuration• Possibilité utiliser un
ThreadPoolTaskExecutor
Scaling: Step en parallèle
Scaling: Remote Chunking
• Répartition de la charge vers des slaves• Principe
– Lecture sur le Master– Processor et Writer sur les slaves
• Spring Batch propose que des interfaces• Spring Integration propose une
implementation• La communication master/slave se fait à
travers un MOM
Scaling: Remote Chunking Master
Slave 1
ChunkProcessor
Writer
ChunkProcessor
Reader
ChunkProvider
Slave 2
ChunkProcessor
Writer
Slave N
ChunkProcessor
Writer
Scaling: Remote Chunking
• Démo ?!
Scaling: Partitioning
• Répartir les données suivant une clé de partition– « Partitionner »
• Traiter les données– « PartitionHandler »
• Et vous pouvez combiner les techniques précédentes
Scaling: Partitioning