繁体   English   中英

在Spring-Batch中使用Partitioner,步骤初始化时间是否太长?

[英]Step initialization time too long using Partitioner in Spring-Batch?

我正在使用Partitioner来并行化*.csv文件的导入。 该文件夹中大约有3万个文件。

问题:在初始化所有文件之前,作业初始化大约需要1-2h小时。 瓶颈在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;
}

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

按照这里的唯一答案,他们做了一些改进,但是我使用的是最新版本,对于100多个分区,它的速度非常慢。

也看到这个

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM