如何创建用于在 Web 前端显示大型数据集的后端

How to create a backend for displaying large datasets in a web frontend

我在 aws s3 中存储的 parquet 文件中有很多时间序列相关数据被分成一小时的间隔(每小时一个文件)。目的是让 Web 应用程序显示该数据。由于我们无法按要求抓取 s3 上的每个镶木地板,我的方法是使用 ETL 过程聚合这些系列并将它们存储为单个镶木地板,并在 dynamodb table 中用于不同的聚合视图,如年、月、周、日,小时,甚至几分钟。此外,处理过的镶木地板将可以通过 aws athena 进行查询(不是来自前端,因为我希望等待很长时间才能执行查询)

听起来是个合理的计划。我假设您需要一些关于如何实现该目标的指示?

根据您当前数据集的大小,以及您使用 Athena 查询它的要求,您可能不需要执行 ETL。

您可以设置一个 table,其位置是所有 Parquet 文件的前缀(例如 s3://example/dir/,如果文件使用 s3://example/dir/2020/03/13/12/file.parquet 等键存储)。如果您的总数据集不超过几千兆字节,我会推荐这个。如果您的数据集更大,并且被组织成包含每一天或每一小时的前缀,您可以创建分区 table 并添加分区,其中的位置使用前缀结构(例如 s3://example/dir/2020/03/13s3://example/dir/2020/03/12 用于每日分区或 s3://example/dir/2020/03/13/11 和 s3://example/dir/2020/03/13/12` 用于每小时分区)。除非您每天有数百 GB 的数据,或者您将 运行 使用 Athena 的查询几乎总是只查看几个小时的数据,否则我建议按日期而不是小时进行分区以减少分区数量.

如果您现有的 Parquet 文件非常小,不到一百兆字节,并且 Athena 查询的性能非常重要,您可以尝试将文件 ETL 成更大的文件,看看是否有帮助。它可能会或可能不会,这将取决于。我建议您将 Athena 本身用于 ETL。您可以使用 INSERT INTO to create new partitions in a table based on data in another table. I suggest automating this by creating an Event Bridge rule with a schedule 触发 Lambda 函数,该函数 运行 是 Athena 中的转换查询,或者如果您想避免为等待查询完成而闲置的 Lambda 付费,则可以使用 Step Functions 状态机(或需要等待15分钟以上)。 AWS 有一项名为 Glue ETL 的服务,专为此类事情而设计,但根据我的经验,这不值得。使用 Athena、Lambda 和 Step Functions 在可用性和灵活性方面胜过它。

您可以使用相同的机制将预先计算的时间序列加载到 DynamoDB – 使用 Event Bridge 安排 Lambda 函数,运行s 在 Athena 中查询,并将结果转换为存储在 DynamoDB 中。使用 Step Functions 避免在等待查询完成时支付空闲时间。

如果 Amazon Timestream 被发布,它可能是比 DynamoDB 更好的存储时间序列的目标。还可以考虑将预先计算的时间序列存储为 JSON、CSV 或 Apache Arrow 在 S3 上而不是 DynamoDB,这可能更便宜,并且在某些方面更简单,具体取决于您的用例。

如果您想了解有关如何设置分区 Athena table 的更多详细信息,请告诉我,但请提供更多上下文,以便我可以使其更具体。