2012-07-31 16 views
5

当社MRコードが独立してマップ低減されているデータの有用な診断データ構造を生成し、当社の地図減らすジョブの開発中。これらのデータをmapReduceというコードに簡単に取り込む方法や、Mongoでそれらを保持する方法はありますか?ログファイルへの書き込みは、(a)既に多くのデータが存在し、(b)診断情報が高度に構造化されており、実際にはクエリを実行したいそれ。のMongoDB:MapReduceの副作用

私の調査は、これまでのMRデータ構造はどのようにメモリ内のデータ構造は、「グローバル」スコープにフックを含め、失われている(シリアライズを経由して)値によって渡されることを示唆しています。ネームスペースはメインのJSサーバー側のネームスペースから分離されているので、dbevalはそれらに到達していないようです(または、少なくとも、どこを見るかはわかりません)。すべてのデータベースオブジェクトおよび機能が存在するが、10genはそれらの使用を防ぐために(紛らわしい)エラーメッセージを生成して、最後のではなく、少なくとも、例えば、typeof coll.insert === 'function'trueである関数ではない約coll.insert。 MongoDBの中のロギング/デバッグサポートはかなり限られているため

明確にするために、私は、単一ノードでの開発のためにこれを行うに興味があります。この種の副作用は本番環境では良くありません。

+0

正確にどのような種類のデータを生成していますか? MRの出力は、コレクション内で永続化することができます.C#では、次のように指定します:MyInputCollection.MapReduce(map、reduce、MapReduceOptions.SetOutput( "MyOutputCollection"));その後、永続的なコレクション 'MyOutputCollection'から読み取ります。 –

+0

MR出力から独立した情報を保存します。コードで処理したい詳細な構造化されたロギング/ベンチマーク情報など、データの排出とみなして、ログファイルに格納しないようにします。 – Sim

+0

ログ収集のためにキャップ付きのコレクションを使用しようとしましたが、なぜcoll.insertが失敗するのかよくわかりません。 –

答えて

2

としては、機能を削減/マップ内から別のDBにアクセスする(MongoDBは2.2におけるように)ことができない、推測しました。潜在的なパフォーマンスの影響とは別に、デッドロックやその他の望ましくない副作用を引き起こす可能性もあります。

残念ながら、それは唯一の「バンドのうち、」出力オプションとしてのmongoログにprint()を残します。

あなたの診断出力に応じて、しようとする一つの方法は、次のようになります。

  • は、ログ出力に出力(あるいは出力の実行)を識別できるようになるユニークなマーカーを追加

  • ので、それはいくつかの解析可能な構造で記録され、理想的にあなたprint()

  • はにスクリプトを記述する際に、単一の行に放出されるtojson()を使用して出力をシリアル化独自のマーカーと一致した行のためにログインして、M/R関数内から実行されるコードの

例の報告のために別のコレクションにそれらを挿入mongod.log:

var diag = { 
    'run' : diagrun, 
    'phase': 'map', 
    'key' : z 
} 
print("MAPDIAG:" + tojson(diag)); 

例出力:

$ tail -f mongo.log | grep "^MAPDIAG" 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "mouse" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" } 
MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "cat", "total" : 3 } 
MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "dog", "total" : 2 } 
+0

これは多かれ少なかれ私たちがやったことです。私はコレクションにログを記録し、print()を使用するロガークラスを構築しました。 MRの間、ログ収集挿入は飲み込まれる例外を生成します。私は10genが開発/デバッグサポートにもっと注意を払うことを願っています。 – Sim

+0

@Sim:MongoDBトラッカー(SERVERキュー、コンポーネント 'MapReduce/Distinct/Group')に[Jira issue](https://jira.mongodb.org/browse/SERVER)をいくつか作成すると役に立ちますデバッグに必要なものや有用なものに関する詳細情報。おそらくHadoop [MapReduce Counters](http://diveintodata.org/2011/03/15/an-example-of-hadoop-mapreduce-counter/)と同様のもので、実行の最後にオプションのログ出力コールバックがあります。 – Stennie