我正在学习 spring-batch。我目前正在处理如下所示的生物数据:
interface Variant {
public String getChromosome();
public int getPosition();
public Set<String> getGenes();
}
(变体是基因组上可能与某些基因重叠的位置)。
我已经写了一些Itemreaders/Itemwriters
现在我想每个基因进行一些分析。因此,我想为每个基因(gene1、gene2、...geneN)拆分我的工作流程,以对与一个基因相关的所有变体进行一些统计。
实现 Partioner 的最佳方式是什么?为此(无论如何,这是正确的类(class)吗?)?我见过的所有示例都使用一些“索引”或有限数量的gridSize
?此外,partiton(gridsize)返回的 map 是否必须少于 gridSize 项目,或者我可以返回一个“大” map ,并且 spring-batch 能够并行运行不超过 gridSize
作业吗?如何在最后加入数据?
谢谢
编辑:或者我应该看看 MultiResourceItemWriter ?
最佳答案
使用 Spring Batch 的分区功能时,涉及两个主要类,Partitioner
和 PartitionHandler
.
<强> Partitioner
Partitioner
接口(interface)负责将要处理的数据划分为多个分区。它有一个方法 Partitioner#partition(int gridSize)
负责分析要分区的数据并返回 Map
每个分区一个条目。 gridSize
参数实际上只是整个计算中的一个输入,可以使用或忽略。例如,如果 gridSize
是 5,我可能选择返回恰好 5 个分区,我可能选择过度分区并返回 5 的某个倍数,或者我可能分析数据并意识到我只需要 3 个分区并完全忽略 gridSize
值。
<强> PartionHandler
PartitionHandler
负责 Partitioner
返回的分区的委托(delegate)给 worker 。 Spring生态系统内提供了三个PartitionHandler
实现,a TaskExecutorPartitionHandler
将工作委托(delegate)给当前 JVM 内部的线程,a MessageChannelPartitionHandler
将工作委托(delegate)给远程工作人员,通过某种形式的消息传递中间件进行监听,以及 DeployerPartitionHandler
从 Spring Cloud Task 项目中动态启动新的工作线程来执行提供的分区。
根据上述所有内容,回答您的具体问题:
- 为此实现 Partioner 的最佳方法是什么(它是正确的类吗?)?这通常取决于您的分区数据及其所在的存储。没有进一步了解如何实现你正在存储基因数据,我无法真正评论什么是最好的方法。
- partiton(gridsize) 返回的 map 是否必须包含小于 gridSize 的项目,或者我可以返回一个“大” map 并且 spring-batch 能够并行运行不超过 gridSize 的作业吗?您可以退回
Map
中任意数量的商品如您认为合适。如上所述,gridSize
真正的目的是作为指南。 - 最后如何连接数据?分区步骤应使每个分区彼此独立处理。如果您希望在最后进行某种形式的联接,通常会在分区步骤之后的步骤中执行此操作。
关于java - Spring-Batch:为未知数量的分区编写分区器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46682009/