0

私はRubyのdelayed_job_mongoid gemを使用して、バックグラウンドでマップ/リデュースジョブをキューに入れています。ジョブは問題なく処理され、約 1 分で完了します。

現在、ジョブの処理中にジョブのステータスをクエリしようとしていますが、マップ/リデュースの実行中にdelayed_jobsテーブルで実行したクエリはすべてそこでハングし、すべてのジョブが完了するまでブロックされていることがわかりました.

たとえば、map/reduce の実行中に db.delayed_jobs.find() を実行すると、最後のジョブがすべて終了するまでそこに留まり、最終的にテーブルの内容が表示されます (その時点では空です)。ジョブの実行中にテーブル全体がロックされているかのようです。これは私が期待するものではありません。

確認しましたが、データベース接続が不足していません。何が起こっているか知っている人はいますか?

4

1 に答える 1

0

これは実際には、現時点で MongoDB の map reduce がどのように機能するかの制限です。当分の間、MongoDB にはまだ DB レベルのロックがあり、ジョブが明示的に非アトミックでない限り、マップ リデュース ジョブは特に読み取りロックと書き込みロックの両方を取得します。

mapReduce コマンドを非アトミックにする方法については、こちらを参照してください(注意: これは MongoDB v2.2+ でのみ利用可能です)。

nonAtomicが true の場合、後処理ステップで MongoDB がデータベースをロックできなくなります。ただし、他のクライアントは出力コレクションの中間状態を読み取ることができます。それ以外の場合、map reduce 操作は後処理中にデータベースをロックする必要があります。

一般に、 MongoDB の集約フレームワークは、マップ リデュースよりもパフォーマンスが若干優れています。ただし、これはかなり新しいものであり、まだすべて同じことを行うことはできません。集約フレームワークを介して同じタスクを達成できる場合は、代わりにそれを使用することをお勧めします。

参考までに、操作の種類と各操作に必要なロックの種類の一覧を次に示します。

http://docs.mongodb.org/manual/faq/concurrency/#which-operations-lock-the-database

于 2013-08-22T19:22:57.830 に答える