【问题标题】:Spring batch -Combining Remote Partitioning with remote chunkingSpring Batch - 将远程分区与远程分块相结合
【发布时间】:2020-03-17 20:23:58
【问题描述】:

尝试看看我是否可以设计一个既需要分区又需要远程分块的工作。我们可以让表 A 包含行(表 A 中的列之一将是分区键),对于表 A 中的每一行,我们将拥有表 B,其中包含表中给定外键/分区键的许多子记录一个 。我们需要运行一个查询,根据查询过滤表 A 中的分区键,并且对于每个分区键,处理表 B 中的所有子记录(这里我们在表 B 中将有几百万条记录,所以我们需要记录处理的并行性,因此远程分块)

对于这样的事情,思考春季批处理作业设计的正确方法是什么? enter image description here

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    所以我们需要并行处理记录,因此需要远程分块

    不一定。没有什么可以阻止您在分区步骤的工作人员中使用远程分块,但是 IMO 这会使事情复杂化。

    更简单的方法是使用多个作业。每个作业将使用多线程步骤并行处理不同的分区和处理项目。换句话说,分区键在这里是一个作业参数。这种方法具有以下优点:

    1. 更易于扩展:因为您有两个级别的并行性:

      • 使用多个 JVM 并行运行多个作业(在同一台机器上或不同机器上)
      • 在每个 JVM 中,使用多个线程并行处理项目。
    2. 更易于实施:远程分区和分块不是最容易配置的设置。运行多个作业,每个作业读取select * from TableA where partitionKey = ? 项目并使用多线程步骤(它需要一个single line of code,添加一个任务执行器.taskExecutor(taskExecutor))要容易得多。

    【讨论】:

    • 谢谢马哈茂德。我看到是否可以将其作为单个作业执行的原因是,当所有分区的所有处理完成时,我需要得到通知。每个分区本身将有几百万条记录要处理,一旦所有分区都处理完毕,我们需要通过docs.spring.io/spring-batch/docs/current/api/org/… 的“afterJob”触发另一个作业/进程。
    • 感谢JobStep,您可以为此使用一份工作。这是启动作业的步骤(如果您愿意,可以是子作业)。因此,您可以创建一个运行多个子作业的主作业并将侦听器添加到您的主作业。
    • 我仍在考虑使用“子作业”来进行远程分块,因为每个分区可能有数百万条记录,我们确实希望加快每条记录的处理速度。
    • Mahmoud ,如果我要使用 JobLaucnhGateway 启动多个作业,其中我使用消息总线将 diff 作业负载平衡到 diff 工作人员,有哪些构造可用于确保工作人员不尝试消费消息太多,同时启动太多作业。由于启动的作业本身需要处理数千条记录,因此我不希望同一个工作人员启动另一个工作并由同一个工作人员同时启动太多工作。
    • 要添加到上面的评论,我正在查看docs.spring.io/spring-batch/docs/current/api/org/…,它说我们可以使用 SyncTaskExecutor,如果我将 Job 的启动放在 JmsListener 的“onMessage”中,我会得到一些保证在为下一个作业启动获取下一条消息之前,只启动并完成一条消息和一个作业
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2013-12-17
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多