在 Spring Batch 分区中配置 gridSize

Jar*_*els 5 java parallel-processing spring-batch

在Spring Batch的分区之间的关系gridSize的的PartitionHandler和数量的ExecutionContext通过传回的分区程序是有点混乱。例如,MultiResourcePartitioner声明它忽略 gridSize,但Partitioner文档没有解释何时/为什么可以接受。

例如,假设我有一个taskExecutor我想在不同的并行步骤中重复使用的对象,并且我将其大小设置为 20。如果我使用网格大小为 5的TaskExecutorPartitionerHandler,并且一个MultiResourcePartitioner返回任意数量的分区(每个文件一个),并行性实际上会如何表现?

假设MultiResourcePartitioner为特定运行返回 10 个分区。这是否意味着一次只执行其中的 5 个,直到所有 10 个都完成,并且这 20 个线程中不会有超过 5 个用于此步骤?

如果是这种情况,何时/为什么可以在Parititioner使用自定义实现覆盖时忽略 'gridSize' 参数?我认为如果在文档中对此进行了描述会有所帮助。

如果不是这种情况,我该如何实现?也就是说,我如何重新使用任务执行器并分别定义可以为该步骤并行运行的分区数量以及实际创建的分区数量?

Mic*_*lla 6

这里有几个很好的问题,让我们逐一逐一讨论:

例如,假设我有一个 taskExecutor,我想在不同的并行步骤中重用它,并将其大小设置为 20。如果我使用网格大小为 5 的 TaskExecutorPartitionerHandler 和一个返回任意数字的 MultiResourcePartitioner分区(每个文件一个),并行性实际上如何表现?

TaskExecutorPartitionHandler推迟并发限制为TaskExecutor您提供的。因此,在您的示例中,PartitionHandlerTaskExecutor允许的情况下,最多将使用所有 20 个线程。

如果是这种情况,何时/为什么在使用自定义实现覆盖 Parititioner 时可以忽略“gridSize”参数?我认为如果在文档中对此进行了描述会有所帮助。

当我们查看分区步骤时,需要关注两个组件:thePartitioner和 the PartitionHandler。该Partitioner负责了解的数据进行划分,以及如何才能做到最好。该PartitionHandler负责委派的工作了奴隶的执行。为了PartitionHandler完成它的委托,它需要了解它正在使用的“结构”(本地线程、远程从进程等)。

当瓜分数据要工作(通过Partitioner),它可以是有用的知道有多少工人可用。但是,根据您正在使用的数据,该指标并不总是非常有用。例如,划分数据库行,将它们平均划分为可用的工作线程数是有意义的。然而,在大多数情况下组合或分割文件是不切实际的,因此为每个文件创建一个分区更容易。这两种情况都取决于您尝试划分的数据,以确定 gridSize 是否有用。

如果不是这种情况,我该如何实现?也就是说,我如何重新使用任务执行器并分别定义可以为该步骤并行运行的分区数量以及实际创建的分区数量?

如果您重新使用 a TaskExecutor,您可能无法TaskExecutor这样做,因为这可能会做其他事情。我想知道为什么您要重新使用一个,因为创建一个专用的开销相对较低(您甚至可以将其设置为分步范围,因此它仅在分区步骤运行时创建)。