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



我在aws3中存储的镶木地板文件中有很多时间序列相关集数据,这些数据被分块为一个小时的间隔(每小时一个文件(。其目的是让一个web应用程序显示这些数据。由于我们无法根据请求抓取s3上的每个镶木地板,因此我的方法是使用ETL过程来聚合这些系列,并将它们存储为单个镶木地板和dynamodb表,用于不同的聚合视图,如年、月、周、日、小时甚至分钟。此外,经过处理的镶木地板将与要查询的aws athena一起提供(而不是从前端,因为我预计执行查询的等待时间会很长(

听起来是个合理的计划。我想你想要一些如何实现这一目标的建议吗?

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

您可以设置一个表,该表的位置是所有Parquet文件的前缀(例如,如果文件使用s3://example/dir/2020/03/13/12/file.parquet等键存储,则为s3://example/dir/(。如果你的总数据集不超过几GB,我建议你这样做。如果数据集较大,并且被组织为包含每一天或每一小时的前缀,则可以创建一个分区表,并添加具有使用前缀结构的位置的分区(例如,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文件非常小,不到100兆字节,并且Athena查询的性能非常重要,那么您可以尝试将文件ETL到更大的文件中,看看这是否有帮助。这可能会,也可能不会,这将取决于情况。我建议您将Athena本身用于ETL。可以使用INSERT INTO根据另一个表中的数据在表中创建新分区。我建议通过创建一个事件桥规则来实现自动化,该规则的时间表可以触发在Athena中运行转换查询的Lambda函数,如果你想避免为Lambda闲置等待查询完成(或需要等待超过15分钟(而付费,则可以触发Step Functions状态机。AWS有一个名为Glue ETL的服务,它是为这种事情而设计的,但根据我的经验,这是不值得的。使用Athena、Lambda和Step函数在可用性和灵活性方面胜过它。

您可以使用相同的机制将预先计算的时间序列加载到DynamoDB中——使用事件桥来调度在Athena中运行查询的Lambda函数,并将结果转换为存储在DynamoDB。使用步骤函数可以避免在等待查询完成时为空闲时间付费。

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

如果你想了解更多关于如何设置分区的Athena表的细节,请告诉我,但要提供更多的上下文,这样我就可以让它更具体。

最新更新