我有读取 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/