【问题标题】:Step initialization time too long using Partitioner in Spring-Batch?在 Spring-Batch 中使用 Partitioner 的步骤初始化时间太长?
【发布时间】:2017-05-05 08:41:09
【问题描述】:

我正在使用Partitioner 来并行导入*.csv 文件。文件夹中大约有 30k 个文件。

问题:作业初始化大约需要 1-2 小时,直到所有文件都设置好。瓶颈在SimpleStepExecutionSplitter.split()

问题:步骤初始化需要这么多时间是否正常?或者我可以以某种方式改进它?

@Bean
public Step partitionStep(Partitioner partitioner) {
    return stepBuilderFactory.get("partitionStep")
            .partitioner(step())
            .partitioner("partitioner", partitioner)
            .taskExecutor(taskExecutor())
            .build();
}

@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(4); //run import always with 4 parallel files
    taskExecutor.setMaxPoolSize(4);
    taskExecutor.afterPropertiesSet();
    return taskExecutor;
}


@Bean
public Partitioner partitioner() throws IOException {
    MultiResourcePartitioner p = new MultiResourcePartitioner();
    p.setResources(new PathMatchingResourcePatternResolver().getResources("mypath/*.csv"));
    return p;
}

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    MultiResourcePartitioner 为每个资源创建一个分区。分区创建过程本身非常快(即分区程序非常快地返回执行上下文映射),但是 Spring Batch 需要花费大量时间来填充相应的元数据 DB 表,并且一旦分区数量超过 100,它就会变得非常慢(这都是我个人的经验)。

    根据唯一的回答here,他们做了一些改进,但我使用的是最新版本,对于超过 100 个的分区它非常慢。

    也见this

    我认为,除非您准备好自己重写一堆 API 代码,否则您除了减少分区数量之外别无选择。

    【讨论】:

    • 我正在使用spring.batch.initializer.enabled=falseMapJobRepository,因此仅将任何元数据存储在内存中。无论如何,批处理作业周围的“spring-batch stuff”似乎减慢了它的速度(对于我的 30k 文件,我有 30k 分区;但我必须坚持Partitioner,因为我必须为每个基于文件的文件定义一个输出文件名在输入)。所以不幸的是,我可能不得不在这里放弃spring-batch
    【解决方案2】:

    我使用自定义拆分器,因为在默认拆分器 (https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/java/org/springframework/batch/core/partition/support/SimpleStepExecutionSplitter.java) 中,您为每个 StepExecution 调用 jobRepository.getLastStepExecution。我不使用 spring-batch 的可重启性,所以我可以编写自己的拆分器。现在,数千个文件的步骤初始化需要几秒钟(之前是几分钟)

    【讨论】:

    • 这应该是一条评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多