2012-09-01 5 views
9

私は、高解像度画像(数百万)の大きなディレクトリをPythonを使ってサムネイルに変換しようとしています。私はS3の各画像の場所を格納するDynamoDBテーブルを持っています。AmazonのDynamoDBで分散キューを作成する

これらの画像をすべて1つのEC2インスタンスで処理するのではなく(数週間かかる)、複数のインスタンスを使用して分散アプリケーションを作成したいと思います。

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

特に、私は原子性と並行性について心配しています.2ノードが同時にDynamoDBで同じジョブをチェックアウトするのを防ぐにはどうすればいいですか?

答えて

10

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

さらに複雑なアプローチは、DynamoDBのconditional update mechanismを使用してロック方式を実装することです。例えば、0または1のいずれかのデータモデルに 'beingProcessed'属性を追加することができます。インスタンスが最初に行うことは、この列の条件付き更新を実行し、初期値が1の場合は値を1に変更します。これは適切で堅牢なロック機構にするために、ここでもっとやりがいがあります。

+0

DynamoDBは間違ったツールです。このプロセスは、SQSを使用すると非常に簡単です。 1。DynamoDB = LargeImageLocations> SQS; SQS =プロセス> n * EC2 = UpdateLocation> DynamoDB –

+1

「SQSには、複数のインスタンスが同じメッセージを読み取るのを防ぐための仕組みが組み込まれています」という誤解を招くことがあります。 「一回のみ」の保証はありません。私はDynamoDBを使ってロックする方法を説明していますが、上記のステートメントを削除する方がいいと思います。 –

+0

SQSはHIPAAに準拠していないので、特定の情報をSQSメッセージ自体に保存することが許可されていない場合、nstehrが示唆するものは非常に実行可能な解決策である可能性があります。 –

0

良い/クールなアプローチは、これにはEMRを使用することです。 EMRにHIVEをDynamoDBに接続するためのインターコネクション層があります。 SQLを使用する場合とほぼ同じようにテーブルを歩き回り、操作を実行できます。

あり、ここそのためかなり良いガイドがある:それは、インポート/エクスポートのためhttp://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.html

なく、容易に適合させることができます。

2

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

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

私は、これは古い質問です知っているので、この答えは、元のポスターよりもコミュニティのためのより多くのです。

+0

この方法ダイナモを使用して、プロセスが途中で死ぬと進行中のフラグが決してクリアされない場合、 – Chaos

関連する問題