我希望使用Python将大型高分辨率图像目录(数百万)转换为缩略图。我有一个DynamoDB表,用于存储S3中每个图像的位置。
我不想在一个EC2实例上处理所有这些图像(需要数周时间),而是想使用一堆实例编写分布式应用程序。
我可以使用哪些技术编写一个队列,允许节点从数据库中“检出”图像,调整大小,并使用生成的缩略图的新维度更新数据库?
具体来说,我担心原子性和并发性 - 如何防止两个节点同时使用DynamoDB检出同一个作业?
答案 0 :(得分:10)
您可以采用的一种方法是将Amazon's Simple Queue Service(SQS)与DynamoDB结合使用。因此,您可以做的是将消息写入队列,其中包含类似DynamoDB中图像条目的哈希键的内容。每个实例都会定期检查队列并关闭消息。当一个实例从队列中获取一条消息时,它会在给定的时间内对其他实例不可见。然后,您可以查找并处理图像并从队列中删除该消息。如果出于某种原因处理图像出现问题,则不会删除该消息,并且其他实例可以抓取该消息。
另一种可能更复杂的方法是使用DynamoDB的conditional update mechanism来实现锁定方案。例如,您可以向数据模型添加“beingProcessed”属性,即0或1.实例可以做的第一件事是对此列执行条件更新,如果初始值为0,则将值更改为1这里可能还有更多的工作要做,使其成为一个合适/强大的锁定机制....
答案 1 :(得分:3)
使用DynamoDB的版本控制的乐观锁定将允许节点"签出"通过将状态字段更新为" InProgress"来完成工作。如果其他节点尝试通过更新状态字段来检出同一作业,则会收到错误,并且会知道检索其他作业。
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaVersionSupportHLAPI.html
我知道这是一个老问题,所以这个答案对于社区而言比原始海报更多。
答案 2 :(得分:0)
良好/酷的方法是使用 EMR 。 EMR中有一个连接层,用于将HIVE连接到DynamoDB。然后,您可以像使用SQL一样遍历表格并执行操作。
这里有一个很好的好的指南:http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.html
用于导入/导出,但可以很容易地进行调整。
答案 3 :(得分:0)
最近,DynamoDB发布了并行扫描: http://aws.typepad.com/aws/2013/05/amazon-dynamodb-parallel-scans-and-other-good-news.html
现在,10个主机可以同时从同一个表中读取,DynamoDB保证它们不会看到相同的项目。