我有要求读取100个S3文件夹的csv文件。在“单执行”中,它可能仅在几个S3文件夹中获取文件,例如60个文件夹中有文件。我需要处理这60个文件,并将这些数据发布到Kafka主题中。该作业需要每4小时安排一次。 CSV数据可以是小的记录,也可以包含6 GB的巨大数据。 我必须使用Java开发并部署到AWS中。 考虑使用Spring Batch:类似于以下步骤: 1.遍历所有100个S3文件夹,并标识每个包含文件的文件夹,例如60文件夹中有文件。 2.创建许多工作/任务,例如60个作业并并行执行。
限制:在此过程中,我不应该使用AWS EMR。
请向我建议一种以最少的故障数据处理来处理此最佳性能的好方法。
答案 0 :(得分:0)
这是您考虑的一种可能方法。 (仅供参考,我已经使用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
并搜索更多示例以查看这是否是您要采用的方法。祝你好运。