java - 创建n个任务并在Spring Batch中并行执行它们

标签 java spring amazon-web-services spring-batch

我有读取 100 个 S3 文件夹的 csv 文件的要求。在单次执行中,它可能只在少数 S3 文件夹中获取文件,例如 60 个文件夹中有文件。我需要处理这 60 个文件并将这些数据发布到 Kafka 主题中。这项工作需要每 4 小时安排一次。 CSV 数据可以是小记录,也可以是 6 GB 等大数据。 我必须使用 Java 进行开发并部署到 AWS 中。 考虑使用 Spring Batch:如下步骤: 1. 遍历所有 100 个 S3 文件夹并识别每个包含文件的文件夹,例如60个文件夹有文件。 2. 创建许多工作/任务,例如60 个作业并并行执行。

限制:我不应在此过程中使用 AWS EMR。

请建议我一个好的方法来处理这种最佳性能,并最大限度地减少故障数据处理。

最佳答案

这是一种供您考虑的可能方法。 (仅供引用,我已经使用 spring-batch 完成了文件处理,并使用我在这里概述的策略进行了线程处理。但该代码属于我的公司,无法共享。) 我建议您阅读这些文章以了解如何使用 spring-batch 进行扩展。

一、spring-batch文档 https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html

接下来,来自 stackoverflow 本身的一篇好文章。 Best Spring batch scaling strategy

阅读完这两本书并理解所有不同的方式后,我建议您专注于分区, https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#partitioning

这也是我使用的技术。在您的情况下,您可以从分区器中为每个文件生成线程数。

您可能需要维护状态,即文件是否分配给线程。 “正在处理”和“已完成处理”也可以是代码中的状态。 这取决于您的要求。 (我在单例中维护了一整套状态,所有线程在拾取文件后都会更新,并完成处理文件等)

您还需要考虑在 4 小时窗口结束之前完成每个文件。您可以按原样保留文件,或者您可能希望在处理时将其移动到新位置。或在处理时重命名文件。同样,这取决于您的要求。但你需要考虑一下这种情况。 (在我的例子中,我通过添加由时间戳(以毫秒为单位)组成的唯一后缀来重命名该文件,因此它不会被新文件覆盖。)

最后,来自博客的示例,通过分区器处理 5 个 csv 文件。 您可以从此示例开始。 https://www.baeldung.com/spring-batch-partitioner

并搜索更多示例,看看这是否是您想要采用的方法。祝你好运。

关于java - 创建n个任务并在Spring Batch中并行执行它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61789754/

相关文章:

java - 具有额外列 XML 映射的 Hibernate 多对多

java - Objectify - 与 IN 过滤器操作相反

linux - Kubernetes 无法为超时的 Pod 挂载卷

amazon-web-services - 如何在 Typescript 中优雅地导入 AWS - Lambda?

node.js - 文件下载在 Nodejs 中给出损坏的文件

java - 413 请求实体太大 - 使用 Spring Boot 和 Rest 模板

java - 禁用 Dart 和 Kotlin 插件后 Android Studio 未运行

spring - 在 XML Bean 定义中引用带注释的 Spring 组件

java - spring属性初始化问题

java - Jackson 在序列化时触发 JPA Lazy Fetching