batchlets 是在 JavaEE Batch 中实现 ETL 步骤的正确方法吗?
Are batchlets the correct way of implementing ETL steps in JavaEE Batch?
我正在研究 Javaee Batch API (jsr-352) 以测试使用该技术将当前 ETL 工具更改为我们自己的解决方案的可行性。
我的目标是建立一份工作,我可以:
- 在步骤 1 中从数据源获取一些(虚拟)数据,
- 步骤 2 中来自其他数据源的一些其他数据和
- 在步骤 3 中合并它们。
我想处理每个项目而不是写入文件,而是将其发送到下一步。并且还存储信息以供进一步使用。我可以使用 batchlet 和 jobContext.setTransientUserData()
.
来做到这一点
我想我没有理解正确的概念:据我了解,JSR-352 用于此类 ETL 任务,但它有两种类型的步骤:块和批处理。块是“三阶段步骤”,其中读取、处理和写入数据。 Batchlets 不是对数据的每个项目执行一次的任务,而是一次(如计算总数、发送电子邮件等)。
我的问题是,如果考虑batchlets的定义,我的解决方案是不正确的。
如何使用 Javaee Batch 实现这一 kinf od 作业 API?
我认为您最好使用块而不是批处理来实现 ETL。使用数据源的典型块处理如下所示:
ItemReader#open()
:打开游标(创建Connection
、Statement
和ResultSet
)并保存为ItemReader
.[=47的实例变量=]
ItemReader#readItem()
:使用 ResultSet
创建并 return 包含一行数据的对象
ItemReader#close()
: 关闭 JDBC 资源
ItemProcessor#processItem()
:进行计算并创建 return 一个包含结果 的对象
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 和块处理的博客条目:
我正在研究 Javaee Batch API (jsr-352) 以测试使用该技术将当前 ETL 工具更改为我们自己的解决方案的可行性。
我的目标是建立一份工作,我可以:
- 在步骤 1 中从数据源获取一些(虚拟)数据,
- 步骤 2 中来自其他数据源的一些其他数据和
- 在步骤 3 中合并它们。
我想处理每个项目而不是写入文件,而是将其发送到下一步。并且还存储信息以供进一步使用。我可以使用 batchlet 和 jobContext.setTransientUserData()
.
我想我没有理解正确的概念:据我了解,JSR-352 用于此类 ETL 任务,但它有两种类型的步骤:块和批处理。块是“三阶段步骤”,其中读取、处理和写入数据。 Batchlets 不是对数据的每个项目执行一次的任务,而是一次(如计算总数、发送电子邮件等)。
我的问题是,如果考虑batchlets的定义,我的解决方案是不正确的。
如何使用 Javaee Batch 实现这一 kinf od 作业 API?
我认为您最好使用块而不是批处理来实现 ETL。使用数据源的典型块处理如下所示:
ItemReader#open()
:打开游标(创建Connection
、Statement
和ResultSet
)并保存为ItemReader
.[=47的实例变量=]ItemReader#readItem()
:使用ResultSet
创建并 return 包含一行数据的对象
ItemReader#close()
: 关闭 JDBC 资源ItemProcessor#processItem()
:进行计算并创建 return 一个包含结果 的对象
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 和块处理的博客条目: