29

私はこの議論を見つけました:MongoDB:ひどいMapReduceパフォーマンス。基本的には、MongoのMRクエリはシングルスレッドであり、リアルタイムではないため、回避するように指示されています。2年が経ちましたが、それから何が変わったのだろうか。これでMongoDb2.2ができました。MRはマルチスレッドになっていると聞きました。Webアプリケーションの頻繁なhttpリクエストのデータのフェッチなど、リアルタイムリクエストのMRの使用に関するアイデアを共有してください。インデックスを有効に活用できますか?

4

1 に答える 1

56

MongoDBのMap/Reduceの機能の現在の状態は次のとおりです

1)Map / Reduceのパフォーマンス制限のほとんどは、MongoDBバージョン2.2のままです。Map / Reduceエンジンでは、すべてのレコードをBSONからJSONに変換する必要があり、実際の計算は組み込みのJavaScriptエンジン(低速)を使用して実行されます。また、単一のグローバルJavaScriptロックがあり、単一のJavaScriptスレッドのみが許可されます。一度に実行します。

シャーディングされたクラスターのMap/Reduceにいくつかの段階的な改善がありました。最も注目すべきは、最終的なReduce操作が複数のシャードに分散され、出力も並列にシャーディングされることです。

MongoDBバージョン2.2でのリアルタイム集計にMap/Reduceをお勧めしません

2)MongoDB 2.2以降、新しいアグリゲーションフレームワークが追加されました。これは、C ++で記述され、MongoDBフレームワークに緊密に統合された集約操作の新しい実装です。

ほとんどのMap/Reduceジョブは、AggregationFrameworkを使用するように書き直すことができます。これらは通常、より高速に実行され(バージョン2.2ではMap / Reduceと比較して20倍の速度向上が一般的です)、既存のクエリエンジンを最大限に活用し、複数のAggregationコマンドを並行して実行できます。

リアルタイムの集約要件がある場合、最初に開始するのは集約フレームワークです。集約フレームワークの詳細については、次のリンクを参照してください。

3)MongoDBバージョン2.4のMap/Reduceが大幅に改善されました。SpiderMonkeyJavaScriptエンジンはV8JavaScriptエンジンに置き換えられ、グローバルJavaScriptロックはなくなりました。つまり、複数のMap/Reduceスレッドを同時に実行できます。

Map / Reduceエンジンは、次の2つの主な理由により、集約フレームワークよりもかなり低速です。

  • JavaScriptエンジンは解釈されますが、AggregationFrameworkはコンパイルされたC++コードを実行します

  • JavaScriptエンジンでは、調査対象のすべてのドキュメントをBSONからJSONに変換する必要があります。出力をコレクションに保存する場合は、結果セットをJSONからBSONに変換して戻す必要があります

2.4と2.6の間でMap/Reduceに大きな変更はありません。

MongoDBバージョン2.4または2.6でリアルタイム集計にMap/Reduceを使用することはまだお勧めしません。

4)Map / Reduceが本当に必要な場合は、Hadoopアダプターを確認することもできます。詳細については、こちらをご覧ください。

于 2012-10-01T19:59:10.690 に答える