【问题标题】:Batch processing from S3 with Airflow使用 Airflow 从 S3 进行批处理
【发布时间】:2019-08-12 13:59:07
【问题描述】:

我从一个每天发送大约 200 万条消息的提要中收到消息。这些消息中的每一条都非常小,不需要以流方式处理它们,因此我一次批处理一整天的消息。

当前基础设施接收这些消息,将它们组合在一起并将包含 1000 条消息的 gzip 压缩文件上传到 AWS S3。这些文件被命名为 yyyymmdd-hhmmss 格式的日期时间戳。批处理每天运行一次(计划在 Airflow 上),它应该从存储桶中选择新文件并进行处理。目前,我没有为这项工作使用任何挂钩或传感器。

我的问题是;如果文件夹还包含所有前一天的文件,那么从 S3 收集新文件的最佳方法是什么?

我的低效解决方案是在 S3 上的文件夹中下拉文件列表并处理文件名与我正在处理的日期匹配的文件。我的批处理是一个 Airflow DAG,所以我想保持幂等性,这意味着我不想在处理后从这个 S3 文件夹中删除文件。

理想情况下,我只想选择文件名中日期时间在前一天午夜之后的文件(从执行日期开始)并处理它们,而不必循环浏览完整的文件列表,因为此列表将不断增长每天都比上一天慢一点。

是否通过 Airflow 或 Python 提供了更好的机制来从 S3 中选择文件?或者有没有一种方法可以更有效地执行这样的任务?

【问题讨论】:

  • 为什么不把处理过的文件移到另一个文件夹呢?这样,您仍然可以将所有文件保存在一个文件夹(即存档)中,而新文件总是转到处理文件夹,因此需要处理此文件夹中的任何内容。

标签: python python-3.x amazon-web-services amazon-s3 airflow


【解决方案1】:

不了解您的完整基础架构,您是否可以在将 gzip 压缩文件上传到 s3 时按日期进行分区?

包含 /date=yyyymmdd/ 的 s3 文件夹前缀意味着您可以仅检索当天的文件并保持幂等性。

当涉及到您的气流作业时,您将日期作为参数传递以仅检索该 s3 分区中的那些日子。

【讨论】:

  • 这将是一个很好的解决方案。不知道为什么我从来没有想过这样做,因为我像这样对后来的文件进行分区!
猜你喜欢
  • 2016-12-27
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
相关资源
最近更新 更多