5

map-reduce ジョブの開発中に、MR コードは、map-reduce されるデータとは関係なく、有用な診断データ構造を生成します。これらのデータを mapReduce を呼び出したコードに渡したり、Mongo で保持したりする簡単な方法はありますか? ログ ファイルに書き込むだけでは、(a) そこには既に大量のデータがあり、(b) 診断情報は高度に構造化されており、実際にクエリを実行したいため、非常に最適ではないことが判明しています。それ。

これまでの私の調査では、MR データ構造は (シリアル化を介して) 値渡しされるため、「グローバル」スコープにフックされたものを含め、メモリ内のデータ構造が失われることが示唆されています。名前空間は、メインの JS サーバー側の名前空間から分離されているためdbeval、それらに到達できないようです (または、少なくとも、どこを見ればよいかわかりません)。最後に大事なことを言い忘れましたが、すべてのデータベース オブジェクトと関数が存在しますが、10gen はそれらの使用を防ぐために (混乱させる) エラー メッセージを生成してcoll.inserttypeof coll.insert === 'function'ますtrue

明確にするために、MongoDB でのロギング/デバッグのサポートはかなり制限されているため、単一ノードでの開発のためにこれを行うことに興味があります。このタイプの副作用は、本番環境では良くありません。

4

1 に答える 1

2

お察しのとおり、(MongoDB 2.2 のように) Map/Reduce 関数内から別の DB にアクセスすることはできません。潜在的なパフォーマンスへの影響とは別に、デッドロックやその他の望ましくない副作用が発生する可能性もあります。

残念ながら、それprint()は唯一の「帯域外」出力オプションとしてmongoログに残されています。

診断出力に応じて、試行する 1 つのアプローチは次のとおりです。

  • ログ出力で出力(または出力実行)を識別できるようにする一意のマーカーを追加します

  • を使用して出力をシリアル化tojson()し、解析可能な構造でログに記録され、理想的には 1 行で出力されるようにします。print()

  • tail一意のマーカーと一致する行の mongod.log ログにスクリプトを書き込み、それらをレポート用に別のコレクションに挿入します

M/R 関数内から実行されるコードの例:

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 }
于 2012-08-24T14:15:02.133 に答える