【发布时间】:2019-12-22 07:11:30
【问题描述】:
我计划将数据存储到 S3 中,稍后将在 S3 上执行 SQL 查询。 S3 文件基本上包含 json 记录。我将通过触发 AWS Lambda 执行的 DynamoDB 流获取这些记录,因此很难在该层处理重复,因为 AWS Lambda 保证 atleast once delivery。
为了避免处理查询中的重复记录,我想确保以唯一的方式插入记录。
据我所知,实现唯一性的唯一方法是拥有唯一的 S3 密钥。如果我选择这种方法,我将结束每天创建数百万个 S3 文件。每个文件由单个 json 记录组成。
在执行 Athena 查询时创建这么多文件是否会成为一个问题? 任何替代方法?
【问题讨论】:
-
每个流记录都分配了一个序列号。你能用这个持久化在第二个 DynamoDB 表中来实现检查点吗?
-
嗯...我想在这种情况下我将不得不引入某种事务行为。例如如果写入 s3 成功,则写入另一个 dynamodb 表。如果写入 dynamoDb 表失败,删除 S3 文件?似乎有点不必要的开销。
-
我同意幂等解决方案更可取,但我没有关于 Athena 查询性能的数据可以分享更多的小文件与更少的大文件。当然,这听起来很容易测试。
-
是的,它确实会影响查询的性能。例如,如果您有一个包含 100 万条记录的 100 MB 文件,那么 Athena 必须将其列出、打开、读取和关闭一次。考虑以下场景您有 100 万个文件,每个文件都有记录,然后 Athena 必须列出所有文件,打开、读取、关闭数百万次,这会极大地影响查询性能。因此理想的文件大小应该在 128 MB 左右。
标签: amazon-web-services amazon-s3 aws-lambda amazon-athena amazon-dynamodb-streams