从DynamoDB获取大量数据?

3
我正在开发一个Spring Boot REST API,需要根据搜索条件从DynamoDB表中获取大量数据(100-200k条记录),并返回响应给API使用者,而无需将整个对象列表加载到内存中。 在基于SQL的数据库中,我使用了JDBCTemplate queryForStreams方法来满足类似的需求。 但对于像DynamoDB这样的NoSQL数据库,我找不到类似的流式传输数据的方法。
其中一种场景是从航空公司xyz的DynamoDB数据库中获取所有在圣诞周末预订商务舱机票的乘客。

对于如此大量的数据,您肯定希望在从DynamoDB读取时将结果流式传输到客户端。因此,我鼓励您使用分页选项。您没有谈论您正在执行什么类型的扫描/提取操作,了解这一点会很有帮助。 - Jesse Barnum
谢谢您的回复。正是您理解了我的情境。我需要像我们使用jdbcTemplate.queryForStream方法来查询SQL数据库一样从DynamoDB中流式传输数据。我从DynamoDB的文章中读到,它有两种流选项:a)Kinesis和DynamoDB流式处理,但两者都是事件驱动的。但是我想要的是根据我的搜索条件获取表格。 - xyzmar
你能举些搜索条件的例子吗?你正在查询索引吗?索引是否包含你所需的所有列,还是只从索引获取ID然后查询表格? - Jesse Barnum
一个例子场景是从航空公司数据库中获取所有在圣诞周末订购商务舱机票的乘客。因此,它基于一些非主键搜索。 - xyzmar
是使用扫描还是索引搜索完成的? - Jesse Barnum
使用scan完成。例如,dynamoDB.scan(scanRequest)。 - xyzmar
4个回答

2

每个请求从DynamoDB读取GB的数据似乎不太可扩展。最终用户是否需要所有这些数据,目的是什么?

DynamoDB每次只能返回1MB的数据,因此对于单个最终用户API调用,您必须对DynamoDB进行许多分页请求。

如果您正在使用Scan,那么您的解决方案根本不可扩展,我可能建议您使用其他数据库。


感谢您的回复。在使用分页时,如何将其流式传输到响应中?因此,在获取数据时,必须立即进行流式传输,以避免内存问题。 - xyzmar
这取决于您使用的SDK。一些Java SDK可以流式传输结果,但默认情况下是惰性加载的,其他SDK则需要使用Limit并遍历页面来模拟流式传输。 - Lee Hannigan

0

一般来说,这不是REST的一个好用例。您考虑过将查询结果存储在S3中吗?

您的REST API将返回一个任务ID,然后您可以使用该ID来检查查询的进度并最终下载结果。

这样,您就可以获得无限的可扩展性,并且可以运行大量并行的Dynamo扫描或查询。


0

-1

DynamoDB

将DDB视为亚马逊用于电子商务的方式-小型分页数据列表,项目通常很小,但必须易于更新。

在这种情况下,您永远不需要从表中存储/提取GB级别的数据。

“我们如何...”问题的需求

我们如何在AWS中存储GB级别的数据并快速检索该数据?

AWS最佳实践

在解决上述“hmw”问题之前,我们需要了解AWS的一些核心原则。

  • 运营卓越性
  • 安全性
  • 可靠性
  • 性能效率
  • 成本优化
  • 可持续性

AWS将这些原则或“支柱”称为其良好架构框架。

您可以在此处阅读更多信息 https://aws.amazon.com/architecture/well-architected/

大多数解决方案都是如下所述:监控、安全、可靠性、性能、成本效益、计算成本低廉(这意味着环保)

各种解决方案的综合自助餐

存储

您需要存储GB级别的数据

虽然取决于您要存储什么,但对于大多数存储需求,您可以使用S3

为了确保我们遵守良好架构框架的规定,我们需要启用加密使用(在传输中,在静止状态下),阻止公共存储桶访问等。

为了使一切成本效益,我们必须考虑何时想要访问这些数据。如果经常访问,则必须使用“热”存储,否则“冷”存储S3选项更便宜,但您会牺牲检索时间。

值得一提的是

如果您有特定的数据科学需求,您应该查看:数据湖(仍在S3下使用),Glue,Athena(在S3上的查询层)

如果您正在存储基于文本的数据并且需要近乎即时的搜索和检索,则使用OpenSearch非常有用-这对于聊天相关数据非常有用

数据存储

这取决于您的应用程序,但大多数人仍然保留一个作为S3查询映射的DynamoDB表。
当您完全理解数据查询或访问模式时,DDB是查询优化和超级高效的。
根据您的访问模式而不是实体来设计表格。
例如。

Option 1: One table

PK               SK
type#order       timestamp
type#transaction timestamp
....

Option 2: Multiple Entity based tables

Order table, 
PK         SK        Attr
id         timestamp productIDs

Transactions table
PK         SK        Attr
id         timestamp amount, orderId

Products table
PK         SK
id         category

一张表的设计简化了在少量请求中检索数据的过程,但您需要调整表格设计直到完美。

我的建议是:创造性地混合和匹配表格样式以适应您的需求。基于实体的表格在大多数应用程序中仍然很有用。

同时,一旦发现新事物,也要准备重做您的表格。

在这里使用基础设施即代码工具来拆卸和重建表格非常关键 - CDK是一个很好的选择。

记住,您将按读取和写入单位计费。设计良好的表格(以匹配您的访问模式)将帮助您以低成本进行简洁查询。

数据检索

这是您根据应用程序而具有的一些选项

再次强烈推荐在S3中存储大型项目,而不是在DynamoDB中存储,因此在这种情况下,从S3中下载GB级别的数据相对容易。

您还可以使用parquet等优化格式存储数据。

如果您选择将DynamoDB用作S3桶的哈希映射,则可以快速找到文件和位置,然后将其放置在队列中,以便后台进行检索。

您还可以将存储桶内的文件复制到作业文件夹中,压缩数据并提供用户使用该压缩包的URL。

您还可以使用DataSync在存储桶之间进行复制。

最后备注

听起来您是在AWS上存储数据并下载进行处理。

大多数团队通过将其处理和存储迁移到AWS,在云中运行整个过程来处理此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接