Являются ли batchlets правильным способом реализации шагов ETL в JavaEE Batch?
Я изучаю Javaee Batch API (jsr-352), чтобы проверить возможность замены текущего инструмента ETL для нашего собственного решения, использующего эту технологию.
Моя цель - построить работу, в которой я:
- получить некоторые (фиктивные) данные из источника данных в шаге 1,
- некоторые другие данные из другого источника данных в шаге 2 и
- объединить их в шаге 3.
Я хотел бы обработать каждый элемент и не записывать в файл, а отправить его на следующий шаг. А также хранить информацию для дальнейшего использования. Я мог бы сделать это с помощью пакетиков и jobContext.setTransientUserData()
,
Я думаю, что я не понимаю концепции: насколько я понял, JSR-352 предназначен для такого рода задач ETL, но имеет 2 типа шагов: чанк и пакетные операции. Чанки - это "3-фазные шаги", при которых считываются, обрабатываются и записываются данные. Пакеты - это задачи, которые выполняются не для каждого элемента данных, а один раз (например, для расчета итогов, отправки электронной почты и т. Д.).
Моя проблема заключается в том, что мое решение не является правильным, если я рассматриваю определение пакетов.
Как можно реализовать эту работу, используя Javaee Batch API?
1 ответ
Я думаю, что для реализации ETL лучше использовать chunk, а не batchlet. Типичная обработка чанка с источником данных выглядит примерно так:
ItemReader#open()
: открыть курсор (создатьConnection
,Statement
а такжеResultSet
) и сохраните их как переменные экземпляраItemReader
,ItemReader#readItem()
: создать и вернуть объект, содержащий данные строки, используяResultSet
ItemReader#close()
: закрыть ресурсы JDBCItemProcessor#processItem()
: сделать расчет и создать и вернуть объект, который содержит результатItemWriter#writeItems()
: сохранить рассчитанные данные в базу данных. открытьConnection
,Statement
и вызватьexecuteUpdate()
и закрой их.
Что касается вашей ситуации, я думаю, что вы должны выбрать те данные, которые считаются первичными, и открыть курсор для них в ItemReader#open()
, затем получить еще один в ItemProcessor#processItem()
за каждый предмет.
Также я рекомендую вам прочитать полезные примеры обработки чанков:
- http://www.radcortez.com/java-ee-7-batch-processing-and-world-of-warcraft-part-1/
- http://www.radcortez.com/java-ee-7-batch-processing-and-world-of-warcraft-part-2/
Мои записи в блоге о JBatch и обработке чанков: