雅典娜在太多 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 查询它们就会很高效。事实上,它甚至会将它们组织到一个文件夹结构中,该文件夹结构可以很好地按写入时间戳进行分区。
我计划将数据存储到 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 查询它们就会很高效。事实上,它甚至会将它们组织到一个文件夹结构中,该文件夹结构可以很好地按写入时间戳进行分区。