在Spring Batch分区中,PartitionHandler的gridSize
与ExecutionContext返回的Partitioner的数量之间的关系有点令人困惑。例如,MultiResourcePartitioner表示它忽略了gridSize,但Partitioner
文档没有解释何时/为什么可以接受这样做。
例如,假设我有一个taskExecutor
我希望在不同的并行步骤中重复使用,并且我将其大小设置为20.如果我使用网格大小TaskExecutorPartitionerHandler 5,并且MultiResourcePartitioner
返回任意数量的分区(每个文件一个),并行性实际上将如何表现?
假设MultiResourcePartitioner
返回特定运行的10个分区。这是否意味着它们中只有5个会一直执行,直到所有10个完成,并且20个线程中不会有超过5个线程用于此步骤?
如果是这种情况,在使用自定义实现覆盖Parititioner
时,/为什么可以忽略'gridSize'参数?我认为如果在文档中描述这将有所帮助。
如果不是这样,我该如何实现?也就是说,如何重新使用任务执行程序并单独定义可以为该步骤并行运行的分区数以及实际创建的分区数?
答案 0 :(得分:3)
这里有一些很好的问题,所以让我们逐一介绍它们:
例如,假设我有一个taskExecutor,我想在不同的并行步骤中重复使用,并且我将其大小设置为20.如果我使用网格大小为5的TaskExecutorPartitionerHandler和返回的MultiResourcePartitioner任意数量的分区(每个文件一个),并行性如何实际表现?
TaskExecutorPartitionHandler
将并发限制推迟到您提供的TaskExecutor
。因此,在您的示例中,PartitionHandler
将最多使用所有20个线程,因为TaskExecutor
允许。
如果是这种情况,何时/为什么在用自定义实现覆盖Parititioner时可以忽略'gridSize'参数?我认为如果在文档中描述这将有所帮助。
当我们查看分区步骤时,有两个值得关注的组件:Partitioner
和PartitionHandler
。 Partitioner
负责理解要分割的数据以及最佳方式。 PartitionHandler
负责将该工作委托给奴隶执行。为了使PartitionHandler
能够执行其委派,它需要了解它正在使用的“结构”(本地线程,远程从属进程等)。
在分割要处理的数据时(通过Partitioner
),可以有助于了解有多少工作人员可用。但是,根据您使用的数据,该指标并不总是非常有用。例如,划分数据库行,将它们均匀地除以可用的工作者数量是有意义的。但是,在大多数情况下,将文件组合或分割是不切实际的,因此每个文件创建分区更容易。这两种情况都取决于您试图划分的数据是否有用。
如果不是这样,我该如何实现?也就是说,如何重新使用任务执行程序并单独定义可以为该步骤并行运行的分区数以及实际创建的分区数?
如果您重新使用TaskExecutor
,则可能无法执行TaskExecutor
其他操作。我想知道为什么你会重新使用一个,因为创建一个专用的开销相对较低(你甚至可以让它跨步作用,所以它只在分区步骤运行时创建)。