4

我想存储和查询大量的原始事件数据。我想使用的架构是“数据湖”架构,其中 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

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

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

4

2 回答 2

2

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

DynamoDBMapper

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

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

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

全球二级指数 (GSI)

DynamoDB 中 Scan 和 Query 的区别

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

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

于 2016-11-10T15:31:49.200 回答
1

首先,我也阅读了同一个 AWS 博客页面:https ://aws.amazon.com/blogs/big-data/building-and-maintaining-an-amazon-s3-metadata-index-without-servers/

使用 DynamoDB 进行这项工作的唯一方法是:

  • 添加另一个名为“foo”的属性并为所有项目设置相同的值 1
  • 添加另一个名为“timestamp”的属性并将纪元时间戳放在那里
  • 使用分区键“foo”和范围键“timestamp”创建 GSI,并投影所有其他属性

看起来有点脏是吧?然后,您可以使用分区键 1(所有项目都有 1)查询过去 24 小时的项目并使用该时间戳范围键。现在,问题:

  1. GSI 的所有项目都具有相同的分区键?如果数据变大,性能会很差
  2. 使用 GSI 的成本更高

您还应该考虑成本。考虑一下您的数据摄取率。每秒将 1000 个对象放入存储桶中的成本约为每月 600 美元,而使用 GSI 则多 600 美元。仅仅因为查询需要(过去 24 小时),您就必须多花 600 美元。

我在设计这个元数据索引时遇到了同样的问题。DynamoDB 看起来不太对劲。当您尝试以使用 RDBMS 的方式使用 DynamoDB 时,总是会遇到这种情况。因为我很少有像你这样的查询需求。我想到了 ElasticSearch 和 s3 列表河插件,它看起来也不好看,因为我必须管理 ES 集群和存储。云搜索呢?看看它的限制,CloudSearch 也不对。

我的要求:

  1. 能够访问具有给定前缀的最新对象
  2. 能够访问特定时间范围内的对象
  3. 通过 AWS EMR、Athena 或 Redshift Spectrum 的密钥空间中的哈希字符串从 S3 中获得最大性能

我都迷失在这里了。我什至考虑过 S3 版本控制功能,因为我可以很自然地获得最新的对象。一切似乎都不太对劲,AWS 文档和博客文章充满了困惑。

这是我整个星期都被困住的地方:(

AWS 的人们只是喜欢绘制图表。当他们介绍一些新的架构方案或概念时,他们只是在其中放了一堆 AWS 产品图标,并说它集成得很漂亮。

于 2017-05-11T07:06:40.840 回答