问题描述
我有一个源存储桶,每秒将插入 5KB 的 JSON 文件。 我想使用 AWS Athena 通过 AWS glue 数据源和爬网程序查询文件。 为了获得更好的查询性能,AWS Athena 建议使用 larger file sizes。
所以我想将源bucket中的文件复制到bucket2并合并。
我打算使用 S3 事件为每个创建的文件在 AWS SQS 中放置一条消息,然后将使用一批 x sqs 消息调用 lambda,读取这些文件中的数据,将它们组合并保存到目标桶。 bucket2 将成为 AWS glue 爬网程序的来源。
这是最好的方法还是我遗漏了什么?
解决方法
不是在 Amazon S3 中每秒接收 5KB JSON 文件,最好的情况是通过 Amazon Kinesis Data Firehose 接收这些数据,它可以根据大小或时间段自动组合数据 .它会输出更少、更大的文件。
您也可以通过对当前设置进行轻微更改来实现此目的:
- 当文件上传到 S3 时,触发 AWS Lambda 函数
- Lambda 函数读取文件并将其发送到 Amazon Kinesis Data Firehose
- Kinesis Firehose 然后按大小或时间对数据进行批处理
或者,您可以使用 Amazon Athena 从多个 S3 对象读取数据并将它们输出到使用Snappy 压缩 Parquet 文件的新表中。这种文件格式对于查询非常有效。但是,您的问题是文件每秒都在到达,因此很难批量查询传入的文件(因此您知道哪些文件已加载,哪些文件未加载)。 kludge 可以是执行以下操作的脚本:
- 在 Athena 中创建一个指向批处理目录(例如
batch/
)的外部表 - 在 Athena 中创建一个指向最终数据的外部表(例如
final/
) - 让传入的文件进入
incoming/
- 定期触发 Lambda 函数,该函数将列出
incoming/
中的对象,将它们复制到batch/
并从incoming/
中删除这些源对象(在此复制期间到达的任何对象处理将留给下一批) - 在 Athena 中,运行
INSERT INTO final SELECT * FROM batch
- 删除
batch/
目录的内容
这会将数据以适合查询的格式附加到 Athena 中的 final
表中。
但是,Kinesis Firehose 选项更简单,即使您需要触发 Lambda 将文件发送到 Firehose。
,您可能可以使用胶水本身来实现。看看这里https://github.com/aws-samples/aws-glue-samples/blob/master/examples/join_and_relationalize.md