2012-10-01 2 views
29

このディスカッションは、MongoDB: Terrible MapReduce Performanceです。基本的には、MongoのMRクエリはシングルスレッドであり、リアルタイムではないとは思わないようにしています。 2年が経ち、当時から何が変わったのだろうか。今我々はMongoDb 2.2を持っている。私はMRがマルチスレッド化されていると聞いた。 Webアプリケーションの頻繁なHTTP要求のためのデータを取得するようなリアルタイム要求については、MRの使用法に関するアイディアを共有してください。それは効果的にインデックスを使用できますか?地図/ MongoDBのMongoDb 2.2、2.4、および2.6のマップを減らす

1を削減するためにここで

+0

Meybe集約フレームワークが軽減マップ今、何かを変更されることがある理由 – user956584

+0

遅い任意のアイデアをダムのですか?それはまだシングルスレッドですか? – YMC

+1

http://stackoverflow.com/a/9434093/979474またはhttp://stackoverflow.com/a/11749738/979474 – user956584

答えて

56

は)機能の現在の状態でマップ/削減のための性能の限界のほとんどは、まだMongoDBのバージョン2.2に残ります。 Map/Reduceエンジンでは、すべてのレコードをBSONからJSONに変換する必要がありますが、実際の計算は埋め込みJavaScriptエンジン(遅い)を使用して実行され、単一のグローバルJavaScriptロックが存在します。一度に実行する。

シャードされたクラスタのMap/Reduceには、いくつかの点で改善が加えられています。最も顕著なのは、最後のReduce操作が複数のShardに分散されており、出力も並行して分割されていることです。

私はMongoDBの2.2以降で)地図/ MongoDBのバージョン2.2

2にリアルタイム集計に削減することをお勧めしません、新しい集約フレームワークは、今そこにあります。これは、C++で書かれ、MongoDBフレームワークに緊密に統合された集約操作の新しい実装です。

アグリゲーションフレームワークを使用するほとんどのマップ/リデュースジョブを書き換えることができます。それらは通常より速く実行されます(マップ/ Reduceと比較して20倍の速度向上がバージョン2.2で一般的です)。既存のクエリエンジンをフルに活用し、複数の集計コマンドを並行して実行できます。

リアルタイムアグリゲーションの要件がある場合は、最初にアグリゲーションフレームワークを使用します。集約フレームワークの詳細については、これらのリンクを見てみましょう:

3)地図の大幅な改善が行われてきた/ MongoDBのバージョン2.4に減らします。 SpiderMonkey JavaScriptエンジンはV8 JavaScriptエンジンに置き換えられました。グローバルなJavaScriptロックがなくなり、複数のMap/Reduceスレッドを同時に実行できるようになりました。

マップ/ 2つの主な理由のために、エンジンがまだ集約フレームワークよりもかなり遅い削減:

  • JavaScriptエンジンが解釈され、集約フレームワーク ランコンパイルしながら、C++コードを

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

地図に有意な変化はありませんにJSONから変換されなければならない/ 2.4と2.6の間で削減します。

MongoDBバージョン2.4または2.6でリアルタイム集計にMap/Reduceを使用することは、まだ推奨されません。

4)Map/Reduceが本当に必要な場合は、Hadoopアダプタも参照できます。詳細については、こちらをあります:

+3

次の2.4バージョンには、パフォーマンスを向上させる別のJavaScriptエンジン(V8)があります。詳細はこちら:http://docs.mongodb.org/manual/release-notes/2.4/ – Kamarey

関連する問題