nat*_*vin 5 sql-server amazon-s3 amazon-redshift amazon-athena
我们有一个 Amazon S3 存储桶,其中包含大约一百万个 JSON 文件,每个文件的压缩大小约为 500KB。这些文件由 AWS Kinesis Firehose 放置在那里,并且每 5 分钟写入一个新文件。这些文件都描述了类似的事件,因此逻辑上都是相同的,并且都是有效的 JSON,但具有不同的结构/层次结构。它们的格式和行结尾也不一致:有些对象在一行上,有些在多行上,有时一个对象的结尾与另一个对象的开头在同一行(即,}{)。
我们需要解析/查询/粉碎这些对象,然后将结果导入到我们的本地数据仓库 SQL Server 数据库中。
Amazon Athena 无法处理不一致的间距/结构。我想过创建一个 Lambda 函数来清理间距,但这仍然留下了不同结构的问题。由于文件是由 Kinesis 放置的,这迫使您将文件放入按年、月、日和小时嵌套的文件夹中,因此我们每年必须创建数千个分区。Athena 中分区数量的限制尚不清楚,但研究表明,如果我们每小时创建一个分区,我们很快就会耗尽这一限制。
我考虑过首先将数据输入 Redshift,然后将其拉下来。Amazon Redshift 外部表可以处理间距问题,但无法处理几乎所有这些文件都具有的嵌套 JSON。COPY命令可以处理嵌套的 JSON,但要求我们事先知道 JSON 结构,并且不允许我们访问完整导入所需的文件名(这是我们获取日期的唯一方法)。总的来说,Redshift 与 Athena 存在同样的问题:不一致的结构导致难以定义模式。
我研究过使用 AWS Glue 等工具,但它们只是移动数据,无法将数据移动到我们的本地服务器中,因此我们必须找到某种中介,这会增加成本、延迟和维护开销。
我尝试过去掉中间人并使用 ZappySys 的 S3 JSON SSIS 任务直接拉取文件并将它们聚合在 SSIS 包中,但它无法处理间距问题或不一致的结构。
我不是第一个面对这个问题的人,但我只是一直在原地踏步。
Rumble是一个开源 (Apache 2.0) 引擎,允许您使用JSONiq查询语言直接查询存储在 S3 上的 JSON(特别是JSON Lines文件),而无需将其移动到其他地方或将其导入到任何数据存储中。在内部,它使用 Spark 和 DataFrames。
它已在超过 200 亿个对象 (10+ TB) 的集合上成功进行了测试,并且如果数据是嵌套的和异构的(缺失字段、额外字段、同一字段中的不同类型等),它也可以无缝运行。它还使用 Amazon EMR 集群进行了测试。
更新:Rumble 还适用于 Parquet、CSV、ROOT、AVRO、文本和 SVM,以及 HDFS、S3 和 Azure。
我可能会建议两种类型的解决方案
除非 JSON 的格式正确,否则没有任何工具能够完美地处理它,我相信 MongoDB/DyanoDB/Cassandra 比 Athena 或 Spectrum 更适合这个用例
如果您能分享您在创建大量分区时遇到的限制,那就太好了?
| 归档时间: |
|
| 查看次数: |
2731 次 |
| 最近记录: |