Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

JBatch

368 views

Published on

.. or not such a big data. In Russian.
For Joker 2016

Published in: Technology
  • Be the first to comment

  • Be the first to like this

JBatch

  1. 1. JBatch … или не очень большие данные
  2. 2. Дмитрий Александров • Ведущий эксперт-программист в T-Systems • 10 лет кодю на энтерпрайз • Bulgarian JUG co-lead • Балуюсь организацией конференций • Люблю самолетики 2
  3. 3. Немного о сегодняшнем докладе • Чаще живу не в России, могу странно произносить слова 3
  4. 4. Немного о сегодняшнем докладе • Чаще живу не в России, могу странно произносить слова • По умолчанию буду рассуждать в рамках Java EE 4
  5. 5. Немного о сегодняшнем докладе • Чаще живу не в России, могу странно произносить слова • По умолчанию буду рассуждать в рамках Java EE • Для демо буду использовать Arquillian 5
  6. 6. 6
  7. 7. а вообще зачем нужны компьютеры?
  8. 8. Правильный ответ: Смотреть котиков! Image credits: Simon’s Cat
  9. 9. … но вообще-то они помогают в автоматизации обработки данных
  10. 10. … а вы помните свою первую задачу на работе?
  11. 11. Я более чем уверен: 1. Взять CSV файлик 2. Распарсить его 3. Сохранить в базе 14
  12. 12. Миром энтерпрайза до сих пор правят CSV/XML файлы! Image credits: pixar
  13. 13. А что вообще такое Batch? 16
  14. 14. А что вообще такое Batch? •Пакетная обработка. 17
  15. 15. А что вообще такое Batch? •Пакетная обработка. •(почти) не участвует оператор. 18
  16. 16. А что вообще такое Batch? •Пакетная обработка. •(почти) не участвует оператор. •(часто) как фоновый процесс. ..наяндексил 19
  17. 17. Пакетная обработка в жизни • Общественный транспорт 20
  18. 18. Пакетная обработка в жизни • Общественный транспорт • Оптовая торговля 21
  19. 19. Пакетная обработка в жизни • Общественный транспорт • Оптовая торговля • Общепит J 22
  20. 20. А зачем вообще в программировании? • Целый подкласс задач 23
  21. 21. А зачем вообще в программировании? • Целый подкласс задач • Особенно в энтерпрайзе 24
  22. 22. А зачем вообще в программировании? • Целый подкласс задач • Особенно в энтерпрайзе • Исполняются долго 25
  23. 23. А зачем вообще в программировании? • Целый подкласс задач • Особенно в энтерпрайзе • Исполняются долго (… ~41 час) 26
  24. 24. А зачем вообще в программировании? • Целый подкласс задач • Особенно в энтерпрайзе • Исполняются долго (… ~41 час) • За ними можно наблюдать и ими управлять 27
  25. 25. Чем полезна пакетная обработка 28
  26. 26. Чем полезна пакетная обработка • Эффективность 29
  27. 27. Чем полезна пакетная обработка • Эффективность • Лучшая утилизация ресурсов 30
  28. 28. Чем полезна пакетная обработка • Эффективность • Лучшая утилизация ресурсов • Автоматизация 31
  29. 29. Чем полезна пакетная обработка • Эффективность • Лучшая утилизация ресурсов • Автоматизация • Концентрация внимания на одной задаче 32
  30. 30. Что может прийти в голову при слове “Батч” в Java 33
  31. 31. Что может прийти в голову при слове “Батч” в Java • Spring batch 34
  32. 32. Что может прийти в голову при слове “Батч” в Java • Spring batch • Hadoop? 35
  33. 33. Что может прийти в голову при слове “Батч” в Java • Spring batch • Hadoop? • Spark? 36
  34. 34. Что может прийти в голову при слове “Батч” в Java • Spring batch • Hadoop? • Spark? • Websphere datagrid? 37
  35. 35. Что может прийти в голову при слове “Батч” в Java Ну что-нибудь свое: там пару циклов, прочитать файлик .. записать в базу данных! 38
  36. 36. А в чем собственно проблема? • Обычно сводится к циклу: • Прочитать из одного места • Обработать • Положить в другое место/записать результат 39
  37. 37. А в чем собственно проблема? • Обычно сводится к циклу: • Прочитать из одного места • Обработать • Положить в другое место/записать результат • Таких циклов может быть несколько, необходимо управлять 40
  38. 38. А в чем собственно проблема? • Обычно сводится к циклу: • Прочитать из одного места • Обработать • Положить в другое место/записать результат • Таких циклов может быть несколько, необходимо управлять • А что если надо выполнить что- то параллельно? 41
  39. 39. А в чем собственно проблема? • Обычно сводится к циклу: • Прочитать из одного места • Обработать • Положить в другое место/записать результат • Таких циклов может быть несколько, необходимо управлять • А что если надо выполнить что- то параллельно? • А вдруг что-то пойдет не так? 42
  40. 40. А в чем собственно проблема? • Обычно сводится к циклу: • Прочитать из одного места • Обработать • Положить в другое место/записать результат • Таких циклов может быть несколько, необходимо управлять • А что если надо выполнить что- то параллельно? • А вдруг что-то пойдет не так? • А когда и с какой периодичностью запускать? 43
  41. 41. А в чем собственно проблема? • Обычно сводится к циклу: • Прочитать из одного места • Обработать • Положить в другое место/записать результат • Таких циклов может быть несколько, необходимо управлять • А что если надо выполнить что- то параллельно? • А вдруг что-то пойдет не так? • А когда и с какой периодичностью запускать? • А может нужна статистика? 44
  42. 42. тут в голову приходит мысль о «не очень больших данных»
  43. 43. 46
  44. 44. 47
  45. 45. 48
  46. 46. 49
  47. 47. 50
  48. 48. 51
  49. 49. JSR-352 • Экспертная группа создана в 2011 • IBM, VMware, RedHat, Oracle, CrediteSuise и др. 52
  50. 50. 53
  51. 51. JSR-352 • Экспертная группа создана в 2011 • IBM, VMware, RedHat, Oracle, CrediteSuise и др. • Сделана под сильным впечатлением Spring Batch 54
  52. 52. JSR-352 • Экспертная группа создана в 2011 • IBM, VMware, RedHat, Oracle, CrediteSuise и др. • Сделана под сильным впечатлением Spring Batch • Релиз спецификации 24.11.2013 55
  53. 53. JSR-352 • Экспертная группа создана в 2011 • IBM, VMware, RedHat, Oracle, CrediteSuise и др. • Сделана под сильным впечатлением Spring Batch • Релиз спецификации 24.11.2013 • Часть Java EE 7! 56
  54. 54. JSR-352 • Экспертная группа создана в 2011 • IBM, VMware, RedHat, Oracle, CrediteSuise и др. • Сделана под сильным впечатлением Spring Batch • Релиз спецификации 24.11.2013 • Часть Java EE 7! • Но работает и на Java SE) 57
  55. 55. JSR-352 куул фичеры • Обработка данных «Кусками» или полностью 58
  56. 56. JSR-352 куул фичеры • Обработка данных «Кусками» или полностью • Последовательная или параллельная обработка 59
  57. 57. JSR-352 куул фичеры • Обработка данных «Кусками» или полностью • Последовательная или параллельная обработка • Чекпоинты 60
  58. 58. JSR-352 куул фичеры • Обработка данных «Кусками» или полностью • Последовательная или параллельная обработка • Чекпоинты • Управление потоком работы 61
  59. 59. JSR-352 куул фичеры • Обработка данных «Кусками» или полностью • Последовательная или параллельная обработка • Чекпоинты • Управление потоком работы • Остановка/восстановление 62
  60. 60. JSR-352 куул фичеры • Обработка данных «Кусками» или полностью • Последовательная или параллельная обработка • Чекпоинты • Управление потоком работы • Остановка/восстановление • Управление исключениями 63
  61. 61. JSR-352 куул фичеры • Обработка данных «Кусками» или полностью • Последовательная или параллельная обработка • Чекпоинты • Управление потоком работы • Остановка/восстановление • Управление исключениями • Транзакционность 64
  62. 62. JSR-352 куул фичеры • Обработка данных «Кусками» или полностью • Последовательная или параллельная обработка • Чекпоинты • Управление потоком работы • Остановка/восстановление • Управление исключениями • Транзакционность • Mетрики 65
  63. 63. Вместо тысячи слов 66
  64. 64. А пока я тут говорю.. Код можете взять тут: https://github.com/dalexandrov/jbatch-demo 67
  65. 65. Ничего не напоминает? 68
  66. 66. Концепции Job Operator Job Step JobRepository ItemReader ItemProcessor ItemWriter 1 * 1 1 1 1 1 1 Batchlet Chunk Contexts Partitioning Listeners 69 Имплементация Оркестрация Исполнение
  67. 67. Работа штука сложная Job JobInstance JobExecution * * The Midnight Job The Midnight Job 21.10.2016 The Midnight Job 21.10.2016 Attempt One 70
  68. 68. Chunk vs. batchlet • Chunk • ETL Pattern • Содержит по одному Reader, Processor, Writer • Reader/Processor вызываются пока обрабатывается «кусок» • Далее записывается весь «кусок» • Batchlet • Вызывается, исполняется, возвращает return code на выходе ItemReader ItemProcessor ItemWriter 1 1 1 1 1 1 Batchlet Chunk Contexts Partitioning Listeners 71
  69. 69. Внутри Step - chunk ItemReaderStep ItemProcessor ItemWriter read() ReturnStatus execute() T item process(T item) P processedItem write(List<P> processedItems) 72
  70. 70. Определение Step <step id="jokerStep"> <chunk checkpoint-policy="item" item-count="3"> <reader ref="myItemReader"/> <processor ref="myItemProcessor"/> <writer ref="myItemWriter"/> </chunk> </step> Оркестрация 73
  71. 71. ItemReader @Named public class MyItemReader extends AbstractItemReader { @Override public Object readItem() throws Exception {...} } Имплементация 74
  72. 72. ItemProcessor @Named public class MyItemProcessor implements ItemProcessor { @Override public Object processItem(Object item) throws Exception {...} } Имплементация 75
  73. 73. ItemWriter @Named public class MyItemWriter extends AbstractItemWriter { @Override public void writeItems(List<Object> items) throws Exception {...} } Имплементация 76
  74. 74. … а если не все вписывается в ETL pattern?
  75. 75. А batchlet вообще норм BatchletStep process() ReturnStatus execute() ReturnStatus 78
  76. 76. Примерно так @Named public class MyBatchlet extends AbstractBatchlet { @Override public String process() { System.out.println("Joker"); return BatchStatus.COMPLETED.toString(); } } Имплементация 79
  77. 77. Теперь попытаемся со всем этим взлететь JobOperator jobOperator = BatchRuntime.getJobOperator(); Long executionId = jobOperator.start("jokerJob", new Properties()); JobExecution jobExecution = jobOperator.getJobExecution(executionId); Исполнение 80
  78. 78. Batch Exit Status • Job и Step имеют exit status • Для управления workflow • STARTING, STARTED, STOPPING, STOPPED, FAILED, COMPLETED, ABANDONED 81
  79. 79. На этом все! Можно на обед!
  80. 80. И мы собирались только ради этого?
  81. 81. Усложним!
  82. 82. Listeners … <listeners> <listener ref="myJobListener"/> </listeners> … Оркестрация 85
  83. 83. Опаньки…
  84. 84. Exception хэндлинг <chunk checkpoint-policy="item" item-count="3" skip-limit="3" retry-limit="3"> … <skippable-exception-classes> <include class="java.lang.RuntimeException"/> <exclude class="java.lang.IllegalArgumentException"/> </skippable-exception-classes> <retryable-exception-classes> <exclude class="java.lang.IllegalArgumentException"/> </retryable-exception-classes> </chunk> Оркестрация 88
  85. 85. Exception хэндлинг <chunk checkpoint-policy="item" item-count="3" skip-limit="3" retry-limit="3"> … <skippable-exception-classes> <include class="java.lang.RuntimeException"/> <exclude class="java.lang.IllegalArgumentException"/> </skippable-exception-classes> <retryable-exception-classes> <exclude class="java.lang.IllegalArgumentException"/> </retryable-exception-classes> </chunk> Оркестрация 89
  86. 86. Exception хэндлинг <chunk checkpoint-policy="item” item-count="3" skip-limit="3" retry-limit="3"> … <skippable-exception-classes> <include class="java.lang.RuntimeException"/> <exclude class="java.lang.IllegalArgumentException"/> </skippable-exception-classes> <retryable-exception-classes> <exclude class="java.lang.IllegalArgumentException"/> </retryable-exception-classes> </chunk> Оркестрация 90
  87. 87. Checkpoint 91
  88. 88. Checkpoint •Бывает 2х типов: • Item • Custom 92
  89. 89. Checkpoint <step id="jokerStep"> <chunk checkpoint-policy="custom"> <reader ref="myItemReader"/> <processor ref="myItemProcessor"/> <checkpoint-algorithm ref="MyCheckpointAlgorithm"/> </chunk> </step> Оркестрация 93
  90. 90. Алгоритм! @Named public class MyCheckpointAlgorithmextends AbstractCheckpointAlgorithm{ …. @Override public boolean isReadyToCheckpoint() throws Exception { return count % 5 == 0; } } Имплементация 94
  91. 91. Partition © Symantec 95
  92. 92. Partition 96 Database Thread 1 Process CSV: 1. …. ….. 1000. ....
  93. 93. Partition • Что-то типа «шардинга» • Легко оркестрируется • Легко можно написать свой алгоритм распараллеливания 97
  94. 94. Partition 98 Database Thread 1 Process CSV: 1. …. ….. 500. .... Thread 2 Process CSV: 501. …. ….. 1000. ....
  95. 95. Partition <partition> <plan partitions="2"> <properties partition="0"> <property name="start" value="0"/> <property name="end" value="500"/> </properties> <properties partition="1"> <property name="start" value="501"/> <property name="end" value="1000"/> </properties> </plan> </partition> Оркестрация 99
  96. 96. Partition <chunk item-count="3"> <reader ref="myItemReader"> <properties> <property name="start" value="#{partitionPlan['start']}" /> <property name="end" value="#{partitionPlan['end']}" /> </properties> </reader> <processor ref="myItemProcessor"/> <writer ref="myItemWriter"/> </chunk> Оркестрация 100
  97. 97. Partition Реально можно ускориться! 101
  98. 98. Flow/Split
  99. 99. Flow/Split
  100. 100. Постановка задачи 104 Прочитать файл Записать в базу
  101. 101. Постановка задачи 105 Прочитать файл Записать в базу Сгенерировать инвойсы Отправить email Собрать статистику
  102. 102. Постановка задачи 106 Прочитать файл Записать в базу Сгенерировать инвойсы Отправить email Собрать статистику
  103. 103. Flow • Это касается бизнес процессов 107
  104. 104. Flow • Это касается бизнес процессов • Логическое разделение процессов 108
  105. 105. Flow • Это касается бизнес процессов • Логическое разделение процессов • Атомарная последовательность шагов 109
  106. 106. 110
  107. 107. Постановка задачи 111 Прочитать файл Записать в базу Сгенерировать инвойсы Отправить email Собрать статистику
  108. 108. Split • Параллельное исполнение нескольких Flow 112
  109. 109. Split • Параллельное исполнение нескольких Flow • Не путать с Partition 113
  110. 110. Split • Параллельное исполнение нескольких Flow • Не путать с Partition • Внутри могут быть только Flow 114
  111. 111. Split <split id="mySplit"> <flow id="flow1"> <step id="myChunk" next="myBatchlet”>...</step> <step id="myBatchlet">...</step> </flow> <flow id="flow2"> <step id="otherChunk" next= "otherBatchlet">...</step> <step id="otherBatchlet">...</step> </flow> </split> Оркестрация 115
  112. 112. А в чем собственно разница? • Partition это про данные • Flow/Split это про бизнес процессы 116
  113. 113. Decision 117
  114. 114. Decision • Решать что делать дальше • Применяется для Step, Flow и Split • По сути это if/else • Необходимо имплементировать 118
  115. 115. Decision <step id="myStep" next="myDecider"> <batchlet ref="myBatchlet”/> </step> <decision id="myDecider" ref="MyDecider"> <next on="foo" to="myFooStep"/> <next on="bar" to="myBarStep"/> </decision> Оркестрация 119
  116. 116. Decision public class MyDecider implements Decider { public String decide(StepExecution[] executions) throws Exception { return "decision"; } } Имплементация 120
  117. 117. 121
  118. 118. Метрики • readCount – сколько успешно прочитали. • writeCount – сколько успешно записали. • filterCount – сколько отфильтровано ItemProcessor. • commitCount – сколько транзакций закомичено. • rollbackCount – сколько транзакций заролбечино. • readSkipCount – сколько «skippable» исключений кинуто ItemReader. • processSkipCount – сколько «skippable» исключений кинуто ItemProcessor. • writeSkipCount – сколько «skippable» исключений кинуто ItemWriter. 122
  119. 119. Транзакционность • JBatch должен работать как в SE так и в EE • Глобальный режим транзакций в режиме ЕЕ • Коммит происходит при записи чанка • Локальный режим транзакций в режиме SE • По таймауту 123
  120. 120. А там что-то про шедюлер? Или скеджулер?
  121. 121. Ну так вот..
  122. 122. его нет.
  123. 123. Но не надо огорчаться • Это просто не в компетенции JSR-352 128
  124. 124. Но не надо огорчаться • Это просто не в компетенции JSR-352 • В среде EE решается обыкновенным @Scheduler 129
  125. 125. Но не надо огорчаться @Singleton public class BatchJobRunner { @Schedule(dayOfWeek = "Sun") public void scheduleJob() { JobOperator jobOperator = BatchRuntyme.getJobOperator(); jobOperator.start("myJob", new Properties()); } } 130
  126. 126. Но не надо огорчаться • Это просто не в компетенции JSR-352 • В среде EE решается обыкновенным @Scheduler • В среде SE можно прикрутить например Quartz* *http://www.quartz-scheduler.org/ 131
  127. 127. И еще ложки дегтя • Все еще мало стандартных Readers/Writers 132
  128. 128. И еще ложки дегтя • Все еще мало стандартных Readers/Writers • Без Generics 133
  129. 129. И еще ложки дегтя • Все еще мало стандартных Readers/Writers • Без Generics • Только xml конфигурация 134
  130. 130. И еще ложки дегтя • Все еще мало стандартных Readers/Writers • Без Generics • Только xml оркестрация 135
  131. 131. Но ведь есть другие батч движки?
  132. 132. Известные имплементации JSR-352 • JBatch IBM (Glassfish, JEUS) • JBeret (Wildfly) • BatchEE • ну и конечно же Spring Batch* *(не совсем) 137
  133. 133. Spring Batch • Первый стабильный релиз 2009 • Послужило прототипомдля JSR-352 • Сильная интеграция в мире Spring 138
  134. 134. Spring Batch Spring Batch JSR-352 Job Job Step Step Chunk Chunk Item Item ItemReader/ItemStream ItemReader ItemProcessor ItemProcessor ItemWriter/ItemStream ItemWriter JobInstance JobInstance JobExecution JobExecution StepExecution StepExecution JobExecutionListener JobListener StepExecutionListener StepListener Listeners Listeners 139
  135. 135. Spring Batch 140
  136. 136. Spring Batch Spring Batch: <job id="myJob"> <step id="myStep"> <tasklet> <chunk reader="reader" writer="writer" processor="processor" commit-interval="10"/> </tasklet> </step> </job> JSR-352: <job id="myJob"> <step id="myStep" > <chunk item-count="2"> <reader ref="reader"/> <processor ref="processor"/> <writer ref="writer"/> </chunk> </step> </job> 141
  137. 137. Spring Batch С версии 3.0 оркестрацию можно вести в формате JSR-352 J 142
  138. 138. EasyBatch • Относительно молодой проект • Не стандартизованный • Позиционируется как очень простая и легко воспринимаемая альтернатива • Чем-то напоминает стримы • https://github.com/EasyBatch/easybatch-framework 143
  139. 139. EasyBatch public class EasyBatchHelloWorldLauncher { public static void main(String[] args) throws Exception { JobBuilder.aNewJob() .reader(new FlatFileRecordReader(new File("tweets.csv"))) .filter(new HeaderRecordFilter()) .mapper(new DelimitedRecordMapper(Tweet.class, "id", "user", "message")) .processor(new TweetProcessor()) .call(); } } public class TweetProcessor implements RecordProcessor<Record<Tweet>, Record<Tweet>> { @Override public Record<Tweet> processRecord(Record<Tweet> record) { System.out.println(record.getPayload()); return record; } } 144
  140. 140. в помощь JBatch suite 145
  141. 141. в помощь JBoss tools 146
  142. 142. Выводы 147
  143. 143. Выводы • Не стоит недооценивать данный класс задач 148
  144. 144. Выводы • Не стоит недооценивать данный класс задач • Особенно в энтерпрайзе 149
  145. 145. Выводы • Не стоит недооценивать данный класс задач • Особенно в энтерпрайзе • Почти всегда требования будут усложняться 150
  146. 146. Выводы • Не стоит недооценивать данный класс задач • Особенно в энтерпрайзе • Почти всегда требования будут усложняться • Уже почти все придумано! Бери и пользуйся! 151
  147. 147. 152
  148. 148. Можно уже не (так сильно) велосипедить! Вопросы есть? 153
  149. 149. 154
  150. 150. Чтиво для досуга • https://jcp.org/en/jsr/detail?id=352 • http://projects.spring.io/spring-batch/ • http://www.easybatch.org/ 155

×