java-在Spring Batch分区中配置gridSize
作者:互联网
在Spring Batch分区中,PartitionHandler的gridSize与Partitioner返回的ExecutionContext的数量之间的关系有些混乱.例如,MultiResourcePartitioner指出它忽略了gridSize,但是Partitioner文档没有说明何时/为什么可以这样做.
例如,假设我有一个taskExecutor,我想在不同的并行步骤中重复使用,并将其大小设置为20.如果我使用网格大小为5的TaskExecutorPartitionerHandler,并返回一个任意数字的MultiResourcePartitioner分区(每个文件一个),并行性实际表现如何?
假设MultiResourcePartitioner针对特定运行返回10个分区.这是否意味着它们一次只能执行5个,直到全部10个都完成,并且此步骤将使用20个线程中的不超过5个?
如果是这种情况,何时/为什么可以在使用自定义实现覆盖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.因此,在您的示例中,如TaskExecutor所允许,PartitionHandler将最多使用全部20个线程.
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.
当我们看一个分区的步骤时,有两个需要关注的组件:Partitioner和PartitionHandler.分区程序负责了解要分割的数据以及最佳分割方法. PartitionHandler负责将工作委托给从属执行.为了让PartitionHandler进行委派,它需要了解它正在使用的“结构”(本地线程,远程从属进程等).
当分割要处理的数据时(通过分区程序),了解有多少工人可用会很有用.但是,根据您使用的数据,该指标并不总是很有用.例如,划分数据库行,将它们按可用的工作程序数量平均划分是有意义的.但是,在大多数情况下合并或分割文件是不切实际的,因此为每个文件创建一个分区更容易.这两种情况都取决于您要划分的数据,有关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可能正在执行其他操作.我不知道为什么在创建一个专用的开销相对较低的情况下,为什么要重复使用一个(您甚至可以将其设置为作用域,以便仅在分区步骤正在运行时创建它).
标签:parallel-processing,spring-batch,java 来源: https://codeday.me/bug/20191120/2040673.html