web-dev-qa-db-ja.com

Map-MongoDb 2.2、2.4、および2.6でパフォーマンスを低下させる

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

29
YMC

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

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

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

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

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

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

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

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

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

  • 集約フレームワークがコンパイルされたC++コードを実行している間、JavaScriptエンジンは解釈されます

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

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

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

4)Map/Reduceが本当に必要な場合は、Hadoopアダプターを確認することもできます。ここに詳細があります:

56
William Z