使用Spring Batch水平扩展外部流程执行

时间:2015-07-08 15:21:29

标签: java parallel-processing spring-batch scalability

我们工作中的一个步骤涉及运行外部进程(在本例中为R),以对文件系统中的大型文件进行一些处理。然后外部进程将输出文件,然后将这些文件反馈到Spring Batch系统。

外部过程可能需要几分钟才能完成每项任务。我们将为每个要处理的文件有效地启动外部进程,因此在整个作业的生命周期中很容易就会有数十或数百个这样的执行。我们希望水平(和垂直)缩放此执行。

使用Spring Batch,Remote Chunking或Remote Partitioning是否可以成为此步骤的可行解决方案?系统真的只需要说“对于每个输入文件,启动一个R脚本来处理它”,所以实际上没有涉及任何项目或面向块的处理。

远程分块/分区已经证明难以以合理的方式实现,而不会看起来像是矫枉过正。我已经考虑过让这个任务“带外”运行。例如,在处理器中,我会将每个“外部任务”放在JMS队列上,让它拉出来并处理它并等待它已完成的响应。这似乎比使用Remote Chunking / Partitioning要容易得多。

除了Spring Batch之外的其他替代解决方案也是受欢迎的,但我现在想集中精力将此解决方案与Spring Batch集成。

1 个答案:

答案 0 :(得分:2)

您所描述的正是分区的作用。即使是你的带外"选项仍属于分区的作用。

让我们看看我期望这份工作的样子。

工作和主步

正如您所指出的,这项工作是一步到位的工作。我想到的是,单步是一个分区步骤。使用分区步骤,您需要配置的两个主要部分是Partitioner(知道如何划分工作的组件)和PartitionHandler(知道如何将工作发送到的组件)工人)。对于Partitioner,我希望使用MultiResourcePartitioner可行。 Spring Batch提供的这个Partitioner实现为每个文件创建一个分区,由它的配置定义。

如果您要在本地(通过TaskExecutorPartitionHandler)或远程(通过MessageChannelPartitionHandler)执行奴隶,PartitionHandler就是您选择的地方。 PartitionHandler还负责将执行从站的结果聚合为单个状态,以便评估步骤的结果。

奴隶步骤

对于奴隶步骤,有两件。第一个是步骤本身的配置。这与您在线运行步骤没有什么不同。在此示例中,我希望您使用SystemCommandTasklet来运行您的R进程(除非您在JVM上运行它)。

步骤的启动方式取决于远程与本地分区,但也是直接的。

为了记录,我做了一段时间的演讲,演示了YouTube上可用的远程分区:https://www.youtube.com/watch?v=CYTj5YT7CZU该演示的代码也可以在Github上找到:https://github.com/mminella/Spring-Batch-Talk-2.0 < / p>