使用 Spring 批处理横向扩展外部流程执行

Using Spring Batch to horizontally scale external process execution

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

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

使用 Spring 批处理,远程分块或远程分区是否是此步骤的可行解决方案?系统真的只需要说"For each of these input files, launch an R script to process it",所以真的没有涉及任何项目或面向块的处理。

远程 Chunking/Partitioning 已被证明很难以合理的方式实现这一点,而不会显得矫枉过正。我考虑过将此任务改为 运行 "out of band"。例如,在处理器中,我会将每个 "external task" 放在 JMS 队列中,让某些东西将其拉出并处理它并等待它已完成的响应。这似乎比使用 Remote Chunking/Partitioning.

容易得多

也欢迎 Spring Batch 之外的其他替代解决方案,但我现在想专注于将此解决方案与 Spring Batch 集成。

您所描述的正是分区的作用。即使您的 "out of band" 选项仍然属于分区的范围。

让我们来看看我希望这份工作是什么样的。

作业和主步骤

如您所述,该作业是单步作业。我设想的是单个步骤是一个分区步骤。对于分区步骤,您需要配置的两个主要部分是 Partitioner(知道如何划分工作的组件)和 PartitionHandler(知道如何将工作发送到的组件)工人)。对于 Partitioner,我希望使用 MultiResourcePartitioner 会起作用。 Spring Batch 提供的 Partitioner 实现为每个文件创建一个由其配置定义的分区。

PartitionHandler 是您选择是否要在本地执行从站(通过 TaskExecutorPartitionHandler) or remotely (via the MessageChannelPartitionHandler)的地方。 PartitionHandler 还负责将执行从属的结果聚合到单个状态中,以便可以评估步骤的结果。

从属步骤

对于slave step,有两块。首先是步骤本身的配置。这与 运行 在线执行步骤没有什么不同。在这个例子中,我希望你使用 SystemCommandTasklet 到 运行 你的 R 进程(除非你在 JVM 上 运行ning 它)。

该步骤的启动方式取决于远程分区与本地分区,但也很简单。

郑重声明,我前段时间做了一次演讲,演示了 YouTube 上可用的远程分区:https://www.youtube.com/watch?v=CYTj5YT7CZU The code for that demo is also available on Github here: https://github.com/mminella/Spring-Batch-Talk-2.0