【问题标题】:spring batch partitioning performance issue春季批量分区性能问题
【发布时间】:2016-05-23 20:27:41
【问题描述】:

我们有一个春季批处理作业,我们试图处理大约 1000 万条记录。现在在单线程中执行此操作将非常慢,因为我们必须匹配 SLA。

为了提高性能,我们开发了一种 POC,其中主步骤是创建分区,其中每个分区代表一个唯一的产品 ID。这可以在 500 到 4500 之间。在 POC 中,我们有 500 个这样的唯一产品 ID。现在,每个分区都被赋予了一个 prod id 并对其进行步骤操作。所有这些端到端工作正常。

我们注意到,主步骤将分区信息发送到步骤执行请求需要超过 5 分钟。我的意思是,主步骤生成分区和为第一个分区执行的步骤之间存在超过 5 分钟的差异。

什么可能导致这种缓慢?这 5 分钟内 Spring Batch 框架做了什么?

这是在这 5 分钟内执行的 3 个选择

SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED, VERSION, JOB_CONFIGURATION_LOCATION from BATCH_JOB_EXECUTION where JOB_INSTANCE_ID = ? order by JOB_EXECUTION_ID desc;

SELECT JOB_EXECUTION_ID, KEY_NAME, TYPE_CD, STRING_VAL, DATE_VAL, LONG_VAL, DOUBLE_VAL, IDENTIFYING from BATCH_JOB_EXECUTION_PARAMS where JOB_EXECUTION_ID = ?; SELECT STEP_EXECUTION_ID, STEP_NAME, START_TIME, END_TIME, STATUS, COMMIT_COUNT, READ_COUNT, FILTER_COUNT, WRITE_COUNT, EXIT_CODE, EXIT_MESSAGE, READ_SKIP_COUNT, WRITE_SKIP_COUNT, PROCESS_SKIP_COUNT, ROLLBACK_COUNT, LAST_UPDATED, VERSION from BATCH_STEP_EXECUTION where JOB_EXECUTION_ID = ?按 STEP_EXECUTION_ID 排序;

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    查看您的作业存储库的配置。一旦Partitioner 为每个从站步骤创建了ExecutionContexts,主站为每个从站创建一个StepExecution,然后将其发送到从站进行处理。因此,这种滞后可能是由于将所有这些 StepExecutions 插入到您的工作存储库中。作为后续行动,请确保您使用的是最新版本。不久前对此进行了优化(批量插入执行而不是逐个执行)。

    【讨论】:

    • 谢谢迈克尔。我们正在使用 spring batch 3.0.3 并查看它执行 3 组选择的日志。请查看我使用这些选择更新的原始评论。查看插入,它只发生一次以保存上下文信息
    • 我还有一个关于工作回购的问题。查看作业回购配置是什么意思?
    • 我注意到上面的 3 个选择(原始评论)正在为每个分区执行,这 3 个选择加起来需要 1 秒。因此,如果我们有 500 个分区,则执行 500 次这 3 个选择。这需要大部分时间
    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2016-09-07
    • 2015-07-25
    相关资源
    最近更新 更多