在 Spring 批量分区中配置 gridSize

Configuring gridSize in Spring Batch partitioning

在Spring批量分区中,gridSizePartitionHandler and the number of ExecutionContexts returned by the Partitioner is a little confusing. For example, MultiResourcePartitioner的关系说明忽略了gridSize,但是Partitioner文档没有解释when/why 这是可以接受的。

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

假设 MultiResourcePartitioner returns 特定 运行 的 10 个分区。这是否意味着在所有 10 个都完成之前,一次只会执行其中的 5 个,并且这一步将使用 20 个线程中的不超过 5 个?

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

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

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

For example, let's say I have a taskExecutor that I want to re-use across different parallel steps, and that I set its size to 20. If I use a TaskExecutorPartitionerHandler with a grid size of 5, and a MultiResourcePartitioner that returns an arbitrary number of partitions (one per file), how will the parallelism actually behave?

TaskExecutorPartitionHandler 将并发限制推迟到您提供的 TaskExecutor。因此,在您的示例中,PartitionHandler 将使用最多所有 20 个线程,正如 TaskExecutor 所允许的那样。

If this is the case, when/why is it okay to ignore the 'gridSize' parameter when overriding Parititioner with a custom implementation? I think it would help if this was described in the documentation.

当我们查看分区步骤时,需要关注两个组成部分:PartitionerPartitionHandlerPartitioner 负责理解要划分的数据以及如何最好地划分。 PartitionHandler 负责将工作委托给奴隶执行。为了让 PartitionHandler 进行委托,它需要了解它正在使用的 "fabric"(本地线程、远程从属进程等)。

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

If this isn't the case, how can I achieve this? That is, how can I re-use a task executor and separately define the number of partitions that can run parallel for that step and the number of partitions that actually get created?

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