11

Python を使用して、高解像度画像 (数百万) の大きなディレクトリをサムネイルに変換しようとしています。各イメージの場所を S3 に格納する DynamoDB テーブルがあります。

これらすべてのイメージを 1 つの EC2 インスタンスで処理する (数週間かかる) 代わりに、インスタンスの束を使用して分散アプリケーションを作成したいと考えています。

ノードがデータベースから画像を「チェックアウト」し、サイズを変更し、生成されたサムネイルの新しいサイズでデータベースを更新できるようにするキューを作成するには、どのような手法を使用できますか?

具体的には、アトミック性と同時実行性が心配です。DynamoDB で 2 つのノードが同じジョブを同時にチェックアウトしないようにするにはどうすればよいですか?

4

4 に答える 4

11

1 つのアプローチは、 Amazon の Simple Queue Service (SQS)を DynamoDB と組み合わせて使用​​することです。したがって、DynamoDB のイメージ エントリのハッシュ キーのようなものを含むメッセージをキューに書き込むことができます。各インスタンスは定期的にキューをチェックし、メッセージを取得します。インスタンスがキューからメッセージを取得すると、そのメッセージは一定時間、他のインスタンスから見えなくなります。次に、画像を検索して処理し、キューからメッセージを削除できます。何らかの理由で画像の処理に問題が発生した場合、メッセージは削除されず、他のインスタンスが取得できるようになります。

おそらくもっと複雑な別のアプローチは、DynamoDB の条件付き更新メカニズムを使用してロック スキームを実装することです。たとえば、データ モデルに 'beingProcessed' 属性を追加できます。これは 0 または 1 です。インスタンスが最初に実行できるのは、この列に対して条件付き更新を実行し、初期値が次の場合に値を 1 に変更することです。 0. 適切な/堅牢なロック機構にするために、ここでやるべきことはおそらくもっとあります....

于 2012-09-01T14:25:24.413 に答える
3

バージョニングで DynamoDB の楽観的ロックを使用すると、ステータス フィールドを「InProgress」に更新することで、ノードがジョブを「チェックアウト」できるようになります。別のノードがステータス フィールドを更新して同じジョブをチェックアウトしようとすると、エラーが発生し、別のジョブを取得することがわかります。

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaVersionSupportHLAPI.html

これは古い質問であることはわかっているので、この回答は元の投稿者よりもコミュニティ向けです。

于 2015-05-07T14:49:50.220 に答える
0

優れた/クールなアプローチは、これにEMRを使用することです。EMR には、HIVE を DynamoDB に接続するための相互接続レイヤーがあります。次に、SQL テーブルの場合とほぼ同じようにテーブルをウォークスルーし、操作を実行できます。

ここにはかなり良いガイドがあります: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.html

インポート/エクスポート用ですが、簡単に適応できます。

于 2012-09-02T19:25:59.900 に答える