使用 Athena 或 DynamoDB 查询 S3 日志内容

Query S3 logs content using Athena or DynamoDB

我有一个从 S3 日志查询请求 url 的用例。亚马逊最近推出了 Athena 来查询 S3 文件内容。什么是成本和性能方面的最佳选择?

  1. 使用 Athena 查询 S3 文件以获取请求 urls
  2. 将每个文件的元数据与请求url信息存储在DynamoDB中table以供查询

Athena 与 DynamoDB:如果在功能上您可以同时满足您的要求;然后:

  1. DynamoDB 将比 Athena 快很多倍。
  2. DynamoDB 会比 Athena 贵。在 DynamoDB 中,您需要为预配置的 IOPS 付费;而在 Athena 中,您只需在查询时付费(否则您只需支付 s3 存储费用)。

因此,如果您需要很少查询您的数据,Athena 将是一个更好的解决方案,否则 DynamoDB。此外,如果性能很重要,DynamoDB 就是答案。另外,如果您在 S3 中已经有 TB 的数据;那么 Athena 是一个解决方案,因为你为什么要把它加载到 DynamoDB 中,这会花费一个炸弹(直到并且除非你想要在毫秒或秒内查询结果)..

正如 Deepak 提到的,DynamoDB 速度更快,但成本高于 Athena。根据您的用例,使用混合方法实施解决方案可能会在某些情况下为您带来良好的结果。

您可以使用 DynamoDB 来存储最近和读取大量数据。旧的、读取成本低的数据可以存储在 S3 中并使用 Athena 对其进行查询。

但是,在实现方面这会有点复杂。

Amazon DynamoDB 将是 糟糕的选择 运行网络日志查询。

DynamoDB 速度超快,但前提是您根据其主键(“Query”)检索数据。如果您正在 运行 查询 ALL 中的数据 table (例如,在未索引的 Key 中查找特定 IP 地址),DynamoDB 将需要扫描 table 中的所有行,这会花费大量时间(“Scan”)。例如,如果您的 table 配置为每秒 100 次读取,而您扫描 10000 行,则需要 100 秒 (100 x 100 = 10000)。

提示:不要在 NoSQL 数据库中进行全 table 扫描。

Amazon Athena 是扫描日志文件的理想选择! 无需预加载数据 - 只需 运行 查询已存储在 Amazon S3 中的日志.使用标准 SQL 查找您要查找的数据。另外,您只需为从磁盘读取的数据付费。文件格式有点奇怪,因此您需要正确的 CREATE TABLE 语句。

参见:Using AWS Athena to query S3 Server Access Logs

另一种选择是使用 Amazon Redshift,它可以跨越数十亿行的 GB、TB 甚至 PB 级数据。如果您要 运行 频繁查询日志数据,Redshift 非常棒。但是,作为标准 SQL 数据库,您需要将数据预加载到 Redshift 中。遗憾的是,Amazon S3 日志文件不是 CSV 格式,因此您需要将文件 ETL 转换为 suitable 格式。对于偶尔的临时请求,这是不值得的。

很多人也喜欢使用Amazon Elasticsearch Service来扫描日志文件。同样,文件格式需要一些特殊处理,加载数据的管道需要一些工作,但结果是对 S3 日志文件进行近乎实时的交互式分析。

参见:Using the ELK stack to analyze your S3 logs