2016-12-14 54 views
-1

我需要在AWS S3中存储数百万个小型JSON对象(每个大约2,500个字节),并且我需要能够以三种不同方式检索它们:按时间戳或ID或通过MapReduce(Athena,EMR等)。对象键将按时间戳进行组织,因此通过时间戳范围检索对象将非常快捷。此外,共享相同时间戳(例如相同分钟)的对象可以连接成每行包含一个JSON对象的单个S3对象。结合提高了写入性能,并且与EMR和Athena也很好地配合。维护S3对象索引的最佳AWS服务?

但是,通过ID检索将不可能很慢。我还需要一种方法来执行批量查询:例如检索100,000个对象的时间戳(给出100,000个ID的列表)。

在这种情况下,哪种AWS服务可以提供索引S3内容的最佳方式?

回答

1

在发布这个问题后的10个月里,我尝试了使用DynamoDB,并且在基于MySQL的解决方案中苦苦挣扎了一段时间,该解决方案甚至投入生产,但遇到了稳定性问题。最后,我有一段时间来重构并得到了一个我最初没有考虑过的解决方案:将索引存储为S3本身的gzip'd JSON文件,并将它们缓存在需要使用索引进行查询的客户端中。显然,对数据延迟等要求有一些需要考虑的要求,但总的来说,我发现这种方法是最简单的,在原始问题中描述的用例中具有合理的性能。

0

任何数据库都可以为此工作。亚马逊的DynamoDB数据库将工作得很好,因为您不必管理服务器。无论何时将新文件添加到存储桶,您都可以让S3向AWS Lambda函数发送事件通知。然后,Lambda函数可以解析文件以获取需要在数据库中存储和索引的信息,然后将其插入到DynamoDB表中。从那里您可以通过ID或时间戳范围查询DynamoDB表,无论何时您需要从S3中检索文件。

+0

DynamoDB无法在ID列表上查询:http://stackoverflow.com/questions/26980127/filtering-querying-by-the-contents-of-a-list-in-dynamodb –

+0

我错过了“查询通过大量的ID列表“的一部分你的问题。也许ElasticSearch会为你工作?要么或者启动一台Aurora RDS服务器。 –

+0

实际上,您的链接与查询嵌套列表有关,我不确定它应用于您的用例。如果您的ID是DynamoDB表的主键,则可以一次为100条记录(100个ID)执行'BatchGetItem'。 –

0

这个问题当然是在基于意见的边缘。我不会冒险声称这是最好的解决方案,但它是一个可行解决方案的范围内的“哪些AWS服务”方面的问题:MariaDB的RDS是我用于这个确切目的,与S3> SNS>维护RDS索引的Lambda事件,包括查找来自S3的对象元数据并将其存储,并进行正确归一化和索引。

S3> SNS> Lambda而不仅仅是S3> Lambda的原因是我有SNS主题展示给Lambda和SQS队列,这是通过“第二个审视”审核过程读取的,它验证所有内容被正确捕获。

这仍然是在有限的生产使用,在这里,所以我的大部分水桶还没有配置...但截至今天,我有11803,039对象索引在t2.micro RDS机器,并没有任何麻烦,所以远...所以这是相当可敬的,并不昂贵。