使用AWS DynamoDB实现更好分析的架构

时间:2018-05-28 17:33:17

标签: amazon-web-services amazon-dynamodb analytics

我们目前正在生产中使用DynamoDB,我们对它非常满意。它的表格针对我们的应用程序进行了非常优化,并且设计中考虑的所有查询都以非常可接受的水平运行。

然而,我们已经收到了更广泛的分析请求,我们的NoSQL设置非常糟糕。我们已经使用SNS主题跟踪了有限数量的聚合度量标准,但是这种方法对于大量度量标准变得过敏并且不切实际。

我想知道这种情况的最佳做法是什么?是否可以将DynamoDB与RDS同步?

4 个答案:

答案 0 :(得分:1)

Dynamodb不适用于分析。它用于高速事务数据存储。

以下是您可以轻松完成的方法,

  

DynamoDB - >流 - > Lambda - > RDS /红移

我建议使用Redshift,因为它非常适合分析和高度可扩展。

如果您正在寻找交易报告,最好使用RDS。

希望它有所帮助。

答案 1 :(得分:1)

绝对可以选择与RDS / Redshift同步。通常需要某种Glue / Streams pipeline才能完成这项工作,但是设置起来并不难。

另一种选择是Rockset,最近introduced native support for DynamoDB

这实际上取决于数据的大小和复杂性以及所需的分析复杂性。 Rockset非常适合中小型数据(<10TB),可通过最少的设置提供完整的SQL,并可在所有字段上自动创建索引。

全面披露:我在Rockset的工程团队工作。

答案 2 :(得分:0)

  

我想知道这种情况的最佳做法是什么?是一个   将DynamoDB与RDS同步的选项?

正如您已经确定的那样,这是分析的一个选项。如果您有数TB的数据,请将AWS Redshift视为数据仓库解决方案并进行批量分析。

另一方面,如果需要进行实时分析,您可以将DynamoDB更改流式传输到AWS Kinesis Streams并使用Kinesis Analytics,使用标准SQL进行流数据传输。

答案 3 :(得分:0)

最简单的方法是,如果只需要基本分析,则在DynamoDB中使用二级索引。但是,当查询需要对DynamoDB进行扫描时,这是很昂贵的。从根本上讲,这是基本的,没有SQL查询,分组或联接。

有几种不同的选项可用于在DynamoDB上执行更复杂的分析。

  1. DynamoDB +胶水+ S3 +雅典娜

Amazon Athena希望提供一种架构,以便能够对S3中的数据运行SQL查询。作为NoSQL存储库,DynamoDB对存储的文档不施加固定的架构。因此,我们需要提取数据并根据DynamoDB表中观察到的数据类型计算模式。 AWS Glue是一项完全托管的ETL服务,可让我们做到这两者。我们可以使用AWS Glue提供的两个功能-爬网程序和ETL作业。搜寻器是连接到数据存储(例如DynamoDB)并浏览数据以确定架构的服务。另外,Glue ETL Apache Spark作业可以扫描任何DynamoDB表的内容并将其以Parquet格式转储到S3中。根据DynamoDB表的大小和DynamoDB表上的读取带宽,此ETL作业可能需要几分钟到几小时才能运行。这两个过程完成后,我们就可以启动Amazon Athena并在DynamoDB中的数据上运行查询。

  1. DynamoDB + Hive / Spark

Hive集成允许使用HiveQL直接在DynamoDB中查询数据,HiveQL是一种类似于SQL的语言,可以表达分析查询。我们可以通过设置安装了Hive的Amazon EMR集群来实现。设置好集群之后,我们可以登录到主节点,并在Hive中指定一个外部表,该表指向我们要查询的DynamoDB表。它要求我们使用数据类型的特定架构定义来创建此外部表。一个警告是,Hive读取密集,并且必须以足够的读取吞吐量设置DynamoDB表,以免使从其服务的其他应用程序饿死。

  1. DynamoDB + AWS Lambda + Elasticsearch

Elasticsearch可以使用Amazon Elasticsearch Service在AWS上设置,我们可以使用它根据索引的大小,复制和其他要求来供应和配置节点。受管群集需要一些操作来升级,保护和保持性能,但要比完全自己在EC2实例上完全运行它要少得多。由于不支持使用Logstash插件安装Amazon DynamoDB的方法并且很难设置,因此我们可以改为流使用DynamoDB流和AWS Lambda函数将数据从DynamoDB写入Elasticsearch。这种方法需要我们执行两个单独的步骤:我们首先创建一个lambda函数,该函数在DynamoDB流上调用,以将DynamoDB中发生的每个更新发布到Elasticsearch中。然后,我们创建一个Lambda函数(如果EC2实例需要花费比Lambda执行超时的时间来运行脚本,则该EC2实例将DynamoDB的所有现有内容发布到Elasticsearch中)。为了确保我们不会丢失对表的任何写操作。设置好所需的监控后,我们可以从DynamoDB接收Elasticsearch中的文档,并可以使用Elasticsearch对数据进行分析查询

  1. DynamoDB + Rockset

Rockset是一项完全托管的搜索和分析服务,支持SQL连接和聚合。 Rockset与DynamoDB进行了实时集成,可用于使DynamoDB和Rockset之间的数据保持同步。我们可以指定要从中同步内容的DynamoDB表以及为该表建立索引的Rockset集合。 Rockset在完整快照中为DynamoDB表的内容建立索引,然后在发生新更改时对其进行同步。 Rockset集合的内容始终与DynamoDB源同步。在稳定状态下,相隔不超过几秒钟。Rockset通过监视流的状态并提供对DynamoDB的流更改的可见性,自动管理DynamoDB表和Rockset集合之间的数据完整性和一致性。 Rockset自动将DynamoDB表转换为SQL表,并支持包括JOIN在内的复杂分析。

每种方法都有其优点和缺点。该博客有一篇详细的文章,详细介绍了每种方法,并比较了它们的优缺点。 https://www.rockset.com/blog/analytics-on-dynamodb-athena-spark-elastic/

免责声明:我在Rockset工作