雅典娜在太多 S3 文件上的表现

Athena performance on too many S3 files

我计划将数据存储到 S3 中,稍后将在其上执行 SQL 查询。 S3 文件基本上包含 json 条记录。我将通过触发 AWS Lambda 执行的 DynamoDB 流获取这些记录,因此很难在该层处理重复,因为 AWS Lambda 保证 atleast once delivery。 为了避免处理查询中的重复记录,我想确保插入的记录是唯一的。

据我所知,实现唯一性的唯一方法是拥有唯一的 S3 密钥。如果我选择这种方法,我将结束每天创建几百万个 S3 文件。每个文件由单个 json 记录组成。

在执行 Athena 查询时创建这么多文件是否会成为一个问题? 任何替代方法?

我认为您最好在 Athena 本身中处理重复数据删除。对于 Athena 来说,剔除一些重复项将是一件轻而易举的工作。设置一个视图,该视图按唯一 属性 分组并使用 ARBITRARY or MAX_BY(如果您要订购最新的东西)用于非唯一属性,以及 运行 您的查询此视图不必担心每个单独查询中的重复数据删除。

您还可以 运行 使用 CTAS 每天或每周的重复数据删除作业,具体取决于数据的新鲜程度(您还可以使用预先删除重复的历史数据并集进行复杂混合'使用即时去重数据进行编辑)。

当 运行查询 Athena 列出 S3 上的对象时,这不是可并行化的操作(分区表除外,它可以并行化到分区的粒度),并且 S3 的列表仅限于页面大小为 1000。您真的不希望 Athena 查询包含超过 1000 个文件的表(或分区)。

通过 Kinesis Firehose 写入 S3,然后通过 Athena 查询。 Firehose 会将您的记录分组到相对较少的文件中,这样通过 Athena 查询它们就会很高效。事实上,它甚至会将它们组织到一个文件夹结构中,该文件夹结构可以很好地按写入时间戳进行分区。