W-JAX 2013 Spring Batch - Performance und Skalierbarkeit

  • 754 views
Uploaded on

Slides to our (Dennis Schulte and me) talk at the German Java conference W-JAX 2013 in Munich. Subject is the batch processing framework Spring Batch, general hints regarding performance in batch …

Slides to our (Dennis Schulte and me) talk at the German Java conference W-JAX 2013 in Munich. Subject is the batch processing framework Spring Batch, general hints regarding performance in batch applications and scalability options in Spring Batch. Slides are in German.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
754
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
3
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Tobias Flohre / Dennis Schulte | codecentric AG Spring Batch – Performance und Skalierbarkeit
  • 2. Dennis Schulte Düsseldorf @denschu www.github.com/denschu blog.codecentric.de/author/dsc dennis.schulte@codecentric.de www.codecentric.de codecentric AG
  • 3. Tobias Flohre Düsseldorf @TobiasFlohre www.github.com/tobiasflohre blog.codecentric.de/en/author/tobias.flohre tobias.flohre@codecentric.de www.codecentric.de codecentric AG
  • 4. AGENDA Grundlagen Spring Batch Vier Aussagen zu Performance im Batch Skalierungsstrategien codecentric AG
  • 5. AGENDA Grundlagen Spring Batch Vier Aussagen zu Performance im Batch Skalierungsstrategien codecentric AG
  • 6. WAS IST EIN BATCH? Traditionelles Batch-Pattern Read codecentric AG Process Write
  • 7. SPRING BATCH Restart Automatisches Transaktionsmanagement Persistente Job-Metadaten Skip Retry codecentric AG Skalierungsfeatures
  • 8. DOMAIN / KONFIGURATION / ABLAUF Job Step ItemWriter ItemReader ItemProcessor codecentric AG Item Chunk
  • 9. DOMAIN / KONFIGURATION / ABLAUF Job wird als Spring-Konfiguration erstellt Domain Specific Language manifestiert sich in XML-Namespace Zentrale Elemente job step tasklet chunk reader processor writer commit-interval codecentric AG <job id="myJob" > <step id="myStep" > <tasklet> <chunk reader="myReader" processor="myProcessor" writer="myWriter" commit-interval="1" /> </tasklet> </step> </job> 10.11.2013 9
  • 10. DOMAIN / KONFIGURATION / ABLAUF Reader, Processor und Writer implementieren bestimmte Interfaces ItemReader<T> T read() ItemProcessor<I,O> O process(I item) ItemWriter<T> void write(List<? extends T> items) Spring Batch bietet für sehr viele Use Cases Implementierungen an Lesen/Schreiben aus/in eine Datenbank Lesen/Schreiben aus/in ein Flat-File Lesen/Schreiben aus/in ein XML-File Lesen/Schreiben aus/in eine JMS-Queue Lesen/Schreiben mit JPA und viele mehr codecentric AG 10.11.2013 10
  • 11. DOMAIN / KONFIGURATION / ABLAUF item == null || completionPolicy fulfilled Begin Step list of items true 1 list of items For each item false Open transaction ItemReader Item read() ItemProcessor process(Item) ItemWriter write(List<Item>) Commit transaction false 2 true item == null Finish Step codecentric AG 10.11.2013 11
  • 12. DOMAIN / KONFIGURATION / ABLAUF Inkasso Kraftfahrt Inkasso Kraftfahrt am 22.03.13 Inkasso Kraftfahrt am 22.03.13 erster Versuch codecentric AG Job * Step * JobInstance JobParameters * JobExecution * StepExecution
  • 13. DOMAIN / KONFIGURATION / ABLAUF Infrastrukturkomponenten PlatformTransaction Manager JobLauncher JobRepository codecentric AG 10.11.2013 13
  • 14. AGENDA Grundlagen Spring Batch Vier Aussagen zu Performance im Batch Skalierungsstrategien codecentric AG
  • 15. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 1 Kenne EVA Eingabe Verarbeitung Ausgabe codecentric AG
  • 16. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 1 <job id=“step-job"> <step id=“xml-einlesen“>...</step> <step id=“xml-verarbeiten“>...</step> <step id=“xml-schreiben“>...</step> </job> codecentric AG
  • 17. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 1 <job id=“eva-job"> <step id=“xml-step"> <tasklet> <chunk reader=“xml-einlesen“ processor=“xml-verarbeiten" writer=“xml-schreiben“ /> </tasklet> </step> </job> codecentric AG
  • 18. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 1 ExecutionContext ist kein Datenspeicher für Nutzdaten, sondern: Zählerstände Steuerdaten Problem: HeapSize Processor und Writer sollten stateless sein Parallelisierung codecentric AG
  • 19. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 2 Kenne Deine nicht-funktionalen Anforderungen codecentric AG
  • 20. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 2 Mengengerüste Zu erreichender Durchsatz Was läuft parallel? Minimiere den Aufwand! codecentric AG
  • 21. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 3 Kenne Deine Persistenzschicht codecentric AG
  • 22. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 3 Datenlokalität Art des DB-Zugriffs JDBC ORM Transaktionsgröße (commit-interval) codecentric AG
  • 23. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 4 Zahlen sind besser als Vermutungen codecentric AG
  • 24. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 4 Messen, Messen, Messen! Wiederholbarkeit Immer nur einen Parameter ändern Immer im Blick: CPU, Speicher, Datenquellen Ergebnisse protokollieren Testdaten Stetiger Verbesserungsprozess Randsysteme abdecken Tools verwenden Profiling lokal Application Performance Management tools codecentric AG
  • 25. AGENDA Grundlagen Spring Batch Vier Aussagen zu Performance im Batch Skalierungsstrategien codecentric AG
  • 26. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  • 27. SKALIERUNGSSTRATEGIEN Woher kommen die Threads? java.util.concurrent.Executor ThreadPoolExecutor <task:executor id="taskExecutor" pool-size="5"/> ApplicationServer verwalten eigene Threadpools codecentric AG
  • 28. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  • 29. MULTI-THREADED STEP <job id="multithreadedStepJob"> <step id="step"> <tasklet task-executor="taskExecutor" throttle-limit="4"> <chunk reader="reader" processor="processor" writer="writer" commit-interval="3" /> </tasklet> </step> </job> <task:executor id="taskExecutor" pool-size="5"/> codecentric AG
  • 30. MULTI-THREADED STEP Threadsafe Begin Step Open transaction 1 ItemReader Item read() For each item ItemProcessor process(Item) ItemWriter write(List<Item>) Commit transaction 2 File vs. DB vs. JMS Finish Step codecentric AG 10.11.2013 30
  • 31. MULTI-THREADED STEP + Hoch skalierbar + Einfach zu konfigurieren - Alle Komponenten müssen thread-safe sein codecentric AG
  • 32. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  • 33. ASYNCITEMPROCESSOR -> ASYNCITEMWRITER Thread 1 process(item) Thread 2 ItemReader Async ItemProcessor process(item) Thread 3 process(item) codecentric AG Async ItemWriter
  • 34. ASYNCITEMPROCESSOR -> ASYNCITEMWRITER AsyncItemProcessor and AsyncItemWriter Java Concurrency API Future FutureTask Sehr einfach zu konfigurieren Optimal für aufwändige process-Schritte Anreicherung von Daten über langsame APIs Komplexe Berechnungen codecentric AG
  • 35. ASYNCITEMPROCESSOR -> ASYNCITEMWRITER <bean id="processor" class="org.sfw.batch.integration.async.AsyncItemProcessor"> <property name="delegate" ref="delegateProcessor"/> <property name="taskExecutor" ref="taskExecutor"/> </bean> <bean id="writer" class="org.sfw.batch.integration.async.AsyncItemWriter"> <property name="delegate" ref="delegateWriter"/> </bean> <task:executor id="taskExecutor" pool-size="5"/> Achtung: commit-interval > 1 codecentric AG
  • 36. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  • 37. PARALLEL STEPS databaseJob Thread 1 Thread 2 importTablePartner loadTablePartner codecentric AG importTableVertrag loadTableVertrag
  • 38. PARALLEL STEPS <job id="importJob"> <split id="splitStep" task-executor="taskExecutor"> <flow> <step id="partnerStep"> <tasklet ref="partnerTasklet"/> </step> </flow> <flow> <step id="vertragStep"> <tasklet ref="vertragTasklet"/> </step> </flow> </split> </job> codecentric AG
  • 39. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  • 40. PARTITIONING Name Kategorie … … A Dennis … … A Frank … … A Daniel … … B Ben … … B Max … … B Christian … … C Dirk … … C Thomas codecentric AG … Tobias Partitioner … … … C
  • 41. PARTITIONING Name Kategorie … … A Dennis … … A Frank … … A Daniel … … B Ben … … B Max … … B Christian … … C Dirk … … C Thomas codecentric AG … Tobias Partitioner … … … C File 1 File 2 File 3
  • 42. PARTITIONING Name Kategorie … … A Dennis … … A Frank … … A Daniel … … B Ben … … B Max … … B Christian … … C Dirk … … C Thomas codecentric AG … Tobias Partitioner … … … C File 1 File 2 File 3
  • 43. PARTITIONING Partitioner PartitionHandler erzeugt Partitionen verteilt Partitionen an Worker Lokaler Prozess (TaskExecutor) Spring Remoting JMS Hadoop YARN codecentric AG
  • 44. PARTITIONING Begin Step For each item Open transaction ItemReader Item read() ItemProcessor process(Item) ItemWriter write(List<Item>) Commit transaction false For each item Partitioner Open transaction ItemReader Item read() ItemProcessor process(Item) ItemWriter write(List<Item>) Commit transaction false For each item Open transaction ItemReader Item read() ItemProcessor process(Item) ItemWriter write(List<Item>) Commit transaction false codecentric AG Finish Step
  • 45. PARTITIONING <job id="flatfilePartitioningJob"> <step id="partitionedStep" > <partition step="flatfilePartitioningStep" partitioner="partitioner"> <handler task-executor="taskExecutor" /> </partition> </step> </job> <bean id="partitioner" class="org.sfw...support.MultiResourcePartitioner"> <property name="resources" value="file:src/test/resources/*.csv" /> </bean> codecentric AG
  • 46. PARTITIONING + Hoch skalierbar + Kein Bottleneck beim ItemReader + Datenlokalität - Struktur der Input Daten muss bekannt sein codecentric AG
  • 47. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  • 48. REMOTE CHUNKING Slave Node 1 Master Step 1 codecentric AG ChunkProvider ItemReader Chunk Processor ItemWriter Slave Node 2 Chunk Processor ItemWriter
  • 49. REMOTE CHUNKING Begin Step Open transaction 1 ItemReader Item read() Commit transaction Open transaction JMS JMS For each item ItemProcessor process(Item) ItemWriter write(List<Item>) Commit transaction 2 Finish Step codecentric AG
  • 50. REMOTE CHUNKING + Hoch skalierbar + Struktur der Input Daten muss bekannt sein - Ggf. Bottleneck beim ItemReader - Transaktionale Middleware - Alle Items werden serialisiert codecentric AG
  • 51. FRAGEN? Dennis Schulte / Tobias Flohre codecentric AG Merscheider Straße 1 42699 Solingen tobias.flohre@codecentric.de dennis.schulte@codecentric.de www.codecentric.de blog.codecentric.de www.meettheexperts.de codecentric AG 10.11.2013 51