Spring-Batch:为未知数量的分区编写分区程序

时间:2017-10-11 07:13:54

标签: java spring spring-batch bioinformatics partitioning

我正在学习春季批次。我目前正在处理看起来像这样的生物数据:

interface Variant {
  public String getChromosome();
  public int getPosition();
  public Set<String> getGenes();
}

(A Variant 是基因组上可能与某些基因重叠的位置)。

我已经写了一些Itemreaders/Itemwriters

现在我想进行一些分析每个基因。因此,我想将每个基因(gene1,gene2,... geneN)的工作流程分开,以便对与一个基因相关的所有变异进行一些统计。

enter image description here

为此实现Partioner的最佳方法是什么(无论如何它是正确的类吗?)?我见过的所有例子都使用了一些&#39;索引&#39;或有限数量的gridSize?此外,partiton(gridsize)返回的地图是否必须少于gridSize项目,或者我可以返回“&#39; big&#39; map和spring-batch能够并行运行不超过gridSize个作业吗?如何在最后加入数据?

感谢

编辑:或者我应该看看MultiResourceItemWriter?

1 个答案:

答案 0 :(得分:2)

使用Spring Batch的分区功能时,涉及两个主要类,PartitionerPartitionHandler

<强> Partitioner
Partitioner接口负责将要处理的数据划分为分区。它有一个方法Partitioner#partition(int gridSize),负责分析要分区的数据并返回Map,每个分区有一个条目。 gridSize参数实际上只是可以使用或忽略的整体计算的一部分输入。例如,如果gridSize是5,我可以选择返回5个分区,我可以选择过分区并返回5的倍数,或者我可以分析数据并意识到我只需要3个分区并完全忽略gridSize值。

<强> PartionHandler
PartitionHandler负责将Partitioner返回的分区委派给工作人员。在Spring生态系统中,有三个提供的PartitionHandler实现,一个TaskExecutorPartitionHandler将工作委托给当前JVM内部的线程,MessageChannelPartitionHandler委托工作到远程工作者监听某种形式消息中间件,以及Spring Cloud Task项目中的DeployerPartitionHandler,它动态启动新工作程序以执行提供的分区。

如上所述,请回答您的具体问题:

  1. 为此实现分区的最佳方法是什么(无论如何都是正确的类?)?这通常取决于您的分区数据及其所在的存储。无需进一步了解如何你存储基因数据,我无法真正评论最佳方法。
  2. partiton(gridsize)返回的地图是否必须少于gridSize项目,还是我可以返回“大”地图,而spring-batch能够并行运行gridSize作业?您可以根据需要在Map中返回任意数量的项目。如上所述,gridSize实际上是指导。
  3. 如何在最后加入数据?分区步骤应该让每个分区彼此独立地进行处理。如果您希望在结尾处使用某种形式的连接,则通常在分区步骤之后的步骤中执行此操作。