如何创建用于在 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/13
、s3://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 的更多详细信息,请告诉我,但请提供更多上下文,以便我可以使其更具体。
我在 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/13
、s3://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 的更多详细信息,请告诉我,但请提供更多上下文,以便我可以使其更具体。