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