Tobias Flohre / Dennis Schulte | codecentric AG

Spring Batch – Performance und
Skalierbarkeit
Dennis Schulte
Düsseldorf
@denschu
www.github.com/denschu
blog.codecentric.de/author/dsc

dennis.schulte@codecentric.de
ww...
Tobias Flohre
Düsseldorf
@TobiasFlohre
www.github.com/tobiasflohre
blog.codecentric.de/en/author/tobias.flohre

tobias.flo...
AGENDA
Grundlagen Spring Batch
Vier Aussagen zu Performance im Batch
Skalierungsstrategien

codecentric AG
AGENDA
Grundlagen Spring Batch
Vier Aussagen zu Performance im Batch
Skalierungsstrategien

codecentric AG
WAS IST EIN BATCH?

Traditionelles Batch-Pattern

Read

codecentric AG

Process

Write
SPRING BATCH

Restart

Automatisches
Transaktionsmanagement
Persistente
Job-Metadaten

Skip
Retry

codecentric AG

Skalier...
DOMAIN / KONFIGURATION / ABLAUF

Job
Step

ItemWriter

ItemReader
ItemProcessor

codecentric AG

Item

Chunk
DOMAIN / KONFIGURATION / ABLAUF
Job wird als Spring-Konfiguration erstellt
Domain Specific Language manifestiert sich in X...
DOMAIN / KONFIGURATION / ABLAUF
Reader, Processor und Writer implementieren bestimmte Interfaces
ItemReader<T>
T read()
It...
DOMAIN / KONFIGURATION / ABLAUF
item == null ||
completionPolicy

fulfilled
Begin Step

list of items

true

1

list of it...
DOMAIN / KONFIGURATION / ABLAUF

Inkasso
Kraftfahrt
Inkasso
Kraftfahrt am
22.03.13

Inkasso
Kraftfahrt am
22.03.13 erster
...
DOMAIN / KONFIGURATION / ABLAUF
Infrastrukturkomponenten

PlatformTransaction
Manager

JobLauncher

JobRepository

codecen...
AGENDA
Grundlagen Spring Batch
Vier Aussagen zu Performance im Batch
Skalierungsstrategien

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1

Kenne EVA
Eingabe Verarbeitung Ausgabe

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1
<job id=“step-job">
<step id=“xml-einlesen“>...</step>
<step id=“xml-verarbe...
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1

<job id=“eva-job">
<step id=“xml-step">
<tasklet>
<chunk reader=“xml-einles...
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 1
ExecutionContext ist kein Datenspeicher für Nutzdaten, sondern:
Zählerstände...
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 2

Kenne Deine nicht-funktionalen
Anforderungen

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 2
Mengengerüste
Zu erreichender Durchsatz
Was läuft parallel?
Minimiere den Au...
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 3

Kenne Deine Persistenzschicht

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 3
Datenlokalität
Art des DB-Zugriffs
JDBC
ORM

Transaktionsgröße (commit-inter...
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 4

Zahlen sind besser als
Vermutungen

codecentric AG
VIER THESEN ZU PERFORMANCE IM BATCH
Aussage 4
Messen, Messen, Messen!
Wiederholbarkeit
Immer nur einen Parameter ändern
Im...
AGENDA
Grundlagen Spring Batch
Vier Aussagen zu Performance im Batch
Skalierungsstrategien

codecentric AG
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunki...
SKALIERUNGSSTRATEGIEN
Woher kommen die Threads?
java.util.concurrent.Executor
ThreadPoolExecutor

<task:executor id="taskE...
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunki...
MULTI-THREADED STEP
<job id="multithreadedStepJob">
<step id="step">
<tasklet task-executor="taskExecutor" throttle-limit=...
MULTI-THREADED STEP
Threadsafe

Begin Step

Open
transaction

1

ItemReader
Item read()

For each item

ItemProcessor
proc...
MULTI-THREADED STEP
+ Hoch skalierbar
+ Einfach zu konfigurieren

- Alle Komponenten müssen thread-safe sein

codecentric ...
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunki...
ASYNCITEMPROCESSOR -> ASYNCITEMWRITER
Thread 1
process(item)

Thread 2
ItemReader

Async
ItemProcessor

process(item)

Thr...
ASYNCITEMPROCESSOR -> ASYNCITEMWRITER
AsyncItemProcessor and AsyncItemWriter
Java Concurrency API
Future

FutureTask

Sehr...
ASYNCITEMPROCESSOR -> ASYNCITEMWRITER
<bean id="processor" class="org.sfw.batch.integration.async.AsyncItemProcessor">
<pr...
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunki...
PARALLEL STEPS

databaseJob

Thread 1

Thread 2

importTablePartner

loadTablePartner

codecentric AG

importTableVertrag
...
PARALLEL STEPS
<job id="importJob">
<split id="splitStep" task-executor="taskExecutor">
<flow>
<step id="partnerStep">
<ta...
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunki...
PARTITIONING
Name

Kategorie

…

…

A

Dennis

…

…

A

Frank

…

…

A

Daniel

…

…

B

Ben

…

…

B

Max

…

…

B

Chris...
PARTITIONING
Name

Kategorie

…

…

A

Dennis

…

…

A

Frank

…

…

A

Daniel

…

…

B

Ben

…

…

B

Max

…

…

B

Chris...
PARTITIONING
Name

Kategorie

…

…

A

Dennis

…

…

A

Frank

…

…

A

Daniel

…

…

B

Ben

…

…

B

Max

…

…

B

Chris...
PARTITIONING

Partitioner

PartitionHandler

erzeugt Partitionen

verteilt Partitionen an Worker

Lokaler Prozess (TaskExe...
PARTITIONING
Begin Step

For each item

Open
transaction

ItemReader
Item read()

ItemProcessor
process(Item)

ItemWriter
...
PARTITIONING
<job id="flatfilePartitioningJob">
<step id="partitionedStep" >
<partition step="flatfilePartitioningStep" pa...
PARTITIONING
+ Hoch skalierbar
+ Kein Bottleneck beim ItemReader
+ Datenlokalität

- Struktur der Input Daten muss bekannt...
SKALIERUNGSSTRATEGIEN
Multi-threaded Step
AsyncItemProcessor -> AsyncItemWriter
Parallel Steps

Partitioning
Remote Chunki...
REMOTE CHUNKING

Slave Node 1

Master
Step 1

codecentric AG

ChunkProvider

ItemReader

Chunk
Processor

ItemWriter

Slav...
REMOTE CHUNKING

Begin Step

Open
transaction

1

ItemReader
Item read()

Commit
transaction

Open
transaction

JMS

JMS

...
REMOTE CHUNKING
+ Hoch skalierbar
+ Struktur der Input Daten muss bekannt sein

- Ggf. Bottleneck beim ItemReader
- Transa...
FRAGEN?
Dennis Schulte / Tobias Flohre
codecentric AG
Merscheider Straße 1
42699 Solingen
tobias.flohre@codecentric.de
den...
Upcoming SlideShare
Loading in …5
×

W-JAX 2013 Spring Batch - Performance und Skalierbarkeit

1,578 views

Published 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 applications and scalability options in Spring Batch. Slides are in German.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,578
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

W-JAX 2013 Spring Batch - Performance und Skalierbarkeit

  1. 1. Tobias Flohre / Dennis Schulte | codecentric AG Spring Batch – Performance und Skalierbarkeit
  2. 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. 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. 4. AGENDA Grundlagen Spring Batch Vier Aussagen zu Performance im Batch Skalierungsstrategien codecentric AG
  5. 5. AGENDA Grundlagen Spring Batch Vier Aussagen zu Performance im Batch Skalierungsstrategien codecentric AG
  6. 6. WAS IST EIN BATCH? Traditionelles Batch-Pattern Read codecentric AG Process Write
  7. 7. SPRING BATCH Restart Automatisches Transaktionsmanagement Persistente Job-Metadaten Skip Retry codecentric AG Skalierungsfeatures
  8. 8. DOMAIN / KONFIGURATION / ABLAUF Job Step ItemWriter ItemReader ItemProcessor codecentric AG Item Chunk
  9. 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. 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. 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. 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. 13. DOMAIN / KONFIGURATION / ABLAUF Infrastrukturkomponenten PlatformTransaction Manager JobLauncher JobRepository codecentric AG 10.11.2013 13
  14. 14. AGENDA Grundlagen Spring Batch Vier Aussagen zu Performance im Batch Skalierungsstrategien codecentric AG
  15. 15. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 1 Kenne EVA Eingabe Verarbeitung Ausgabe codecentric AG
  16. 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. 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. 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. 19. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 2 Kenne Deine nicht-funktionalen Anforderungen codecentric AG
  20. 20. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 2 Mengengerüste Zu erreichender Durchsatz Was läuft parallel? Minimiere den Aufwand! codecentric AG
  21. 21. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 3 Kenne Deine Persistenzschicht codecentric AG
  22. 22. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 3 Datenlokalität Art des DB-Zugriffs JDBC ORM Transaktionsgröße (commit-interval) codecentric AG
  23. 23. VIER THESEN ZU PERFORMANCE IM BATCH Aussage 4 Zahlen sind besser als Vermutungen codecentric AG
  24. 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. 25. AGENDA Grundlagen Spring Batch Vier Aussagen zu Performance im Batch Skalierungsstrategien codecentric AG
  26. 26. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  27. 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. 28. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  29. 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. 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. 31. MULTI-THREADED STEP + Hoch skalierbar + Einfach zu konfigurieren - Alle Komponenten müssen thread-safe sein codecentric AG
  32. 32. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  33. 33. ASYNCITEMPROCESSOR -> ASYNCITEMWRITER Thread 1 process(item) Thread 2 ItemReader Async ItemProcessor process(item) Thread 3 process(item) codecentric AG Async ItemWriter
  34. 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. 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. 36. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  37. 37. PARALLEL STEPS databaseJob Thread 1 Thread 2 importTablePartner loadTablePartner codecentric AG importTableVertrag loadTableVertrag
  38. 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. 39. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  40. 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. 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. 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. 43. PARTITIONING Partitioner PartitionHandler erzeugt Partitionen verteilt Partitionen an Worker Lokaler Prozess (TaskExecutor) Spring Remoting JMS Hadoop YARN codecentric AG
  44. 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. 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. 46. PARTITIONING + Hoch skalierbar + Kein Bottleneck beim ItemReader + Datenlokalität - Struktur der Input Daten muss bekannt sein codecentric AG
  47. 47. SKALIERUNGSSTRATEGIEN Multi-threaded Step AsyncItemProcessor -> AsyncItemWriter Parallel Steps Partitioning Remote Chunking codecentric AG
  48. 48. REMOTE CHUNKING Slave Node 1 Master Step 1 codecentric AG ChunkProvider ItemReader Chunk Processor ItemWriter Slave Node 2 Chunk Processor ItemWriter
  49. 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. 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. 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

×