DynamoDB 适合作为 S3 元数据索引吗?

Ale*_*ing 6 amazon-s3 amazon-dynamodb data-lake

我想存储和查询大量原始事件数据。我想要使​​用的架构是“数据湖”架构,其中 S3 保存实际的事件数据,DynamoDB 用于对其进行索引并提供元数据。这是一个在很多地方都在谈论和推荐的架构:

但是,我很难理解如何使用 DynamoDB 来查询 S3 中的事件数据。在上面的 AWS 博客链接中,他们使用了存储多个不同服务器生成的客户事件的示例:

S3路径格式:[4-digit hash]/[server id]/[year]-[month]-[day]-[hour]-[minute]/[customer id]-[epoch timestamp].data

例如:a5b2/i-31cc02/2015-07-05-00-25/87423-1436055953839.data

在 DynamoDB 中记录此事件的架构如下所示:

Customer ID (Partition Key), Timestamp-Server (Sort Key), S3-Key, Size
87423, 1436055953839-i-31cc02, a5b2/i-31cc02/2015-07-05-00-25/87423-1436055953839.data, 1234
Run Code Online (Sandbox Code Playgroud)

我想执行一个查询,例如:“获取过去 24 小时内所有服务器生成的所有客户事件”,但据我了解,不使用分区键就不可能有效地查询 DynamoDB。我无法为此类查询指定分区键。

鉴于此要求,我是否应该使用 DynamoDB 以外的数据库来记录我的事件在 S3 中的位置?或者我只需要使用不同类型的 DynamoDB 架构?

not*_*est 3

使用 DynamoDB 数据库,该架构看起来不错且可行。DynamoDBMapper(存在于 AWS SDK Java 中)可用于创建模型,该模型具有从 S3 获取数据的有用方法。

DynamoDB映射器

getS3ClientCache() 返回用于访问 S3 的底层 S3ClientCache。

如果没有分区键,则无法查询 DynamoDB 数据库。如果分区键不可用,您必须扫描整个 DynamoDB 数据库。但是,您可以在日期/时间字段上创建全局二级索引 (GSI)并查询您的用例的数据。

简单来说,GSI 类似于任何 RDBMS 中存在的索引。不同的是,你可以直接查询GSI而不是主表。通常,如果您想在分区键不可用时查询 DynamoDB 以了解某些用例,则需要 GSI。有一些选项可用于包含GSI 主表中存在的所有(或)选择性字段。

全球二级指数(GSI)

DynamoDB 中扫描和查询之间的区别

是的,在这个用例中,看起来 GSI 无法提供帮助,因为该用例需要对分区键进行RANGE 查询。DynamoDB 仅支持相等运算符。如果分区键可用,DynamoDB 支持对排序键或其他非键属性进行范围查询。您可能必须扫描 DynamoDB 才能完成此用例,这是一项成本高昂的操作。

您要么考虑替代数据模型,您可以在其中通过分区键查询或使用其他数据库。