2013-06-06 23 views
11

MongoDB 2.4.3(2.4.4も試してみました)をmapReduceと組み合わせて、各3つのレプリカで2つのシャードを持つクラスタで使用しようとしていました。 mapReduceジョブの結果が出力コレクションに縮小されないという問題があります。私はIncremental Map Reduceを試しました。私も減らす代わりに "マージ"を試みましたが、それはどちらもうまくいかなかったのです。だから私はMapReduceのが上で実行されていることがわかりMapReduceが出力されません

{ 
    "result" : "events", 
    "counts" : { 
     "input" : NumberLong(2), 
     "emit" : NumberLong(2), 
     "reduce" : NumberLong(0), 
     "output" : NumberLong(28304112) 
    }, 
    "timeMillis" : 418, 
    "timing" : { 
     "shardProcessing" : 11, 
     "postProcessing" : 407 
    }, 
    "shardCounts" : { 
     "stats2/192.168.…:27017,192.168.…" : { 
      "input" : 2, 
      "emit" : 2, 
      "reduce" : 0, 
      "output" : 2 
     } 
    }, 
    "postProcessCounts" : { 
     "stats1/192.168.…:27017,…" : { 
      "input" : NumberLong(0), 
      "reduce" : NumberLong(0), 
      "output" : NumberLong(14151042) 
     }, 
     "stats2/192.168.…:27017,…" : { 
      "input" : NumberLong(0), 
      "reduce" : NumberLong(0), 
      "output" : NumberLong(14153070) 
     } 
    }, 
    "ok" : 1, 
} 

:(高専はシャードではありません)

db.coll.mapReduce(map, reduce, {out: {reduce: "events", "sharded": true}}) 

次のような出力が得られます。

マップmongos上のコマンドの実行を減らします2個のレコードが出力され、2個のレコードが出力されます。しかし、両方のシャードのpostProcessCountsでは、入力カウントは0のままです。また、_idでの検索でレコードを検索しようとすると、結果は得られません。 MongoDBのログファイルでは、これに関するエラーメッセージを見つけることができませんでした。

新しく作成した出力コレクションでこれを再現しようとしたところ、ハッシュされた_idも破棄して同じインデックスを付けましたが、これを再現できませんでした。別のコレクションに

db.coll.mapReduce(map, reduce, {out: {reduce: "events_test2", "sharded": true}}) 

を同じ入力を出力する場合、結果は、出力コレクションに格納されており、私は次の出力ました:再びouputting同じ入力で再びスクリプトを実行すると

{ 
    "result" : "events_test2", 
    "counts" : { 
     "input" : NumberLong(2), 
     "emit" : NumberLong(2), 
     "reduce" : NumberLong(0), 
     "output" : NumberLong(4) 
    }, 
    "timeMillis" : 321, 
    "timing" : { 
     "shardProcessing" : 68, 
     "postProcessing" : 253 
    }, 
    "shardCounts" : { 
     "stats2/192.168.…:27017,…" : { 
      "input" : 2, 
      "emit" : 2, 
      "reduce" : 0, 
      "output" : 2 
     } 
    }, 
    "postProcessCounts" : { 
     "stats1/192.168.…:27017,…" : { 
      "input" : NumberLong(2), 
      "reduce" : NumberLong(0), 
      "output" : NumberLong(2) 
     }, 
     "stats2/192.168.…:27017,…" : { 
      "input" : NumberLong(2), 
      "reduce" : NumberLong(0), 
      "output" : NumberLong(2) 
     } 
    }, 
    "ok" : 1, 
} 

を2番目のコレクション、それはpostProcessCountsで減少していることを示しています。だからマップと関数を減らすことはうまく機能します。なぜそれはより大きい最初のコレクションで動作しませんか?私はここで何か間違っていますか? map-reduceの出力として使用できるコレクションには特別な制限はありますか?

+0

このコレクションは断片化されていないため(小さい場合)、共有されていない出力コレクションにmapreduceを実行してみませんか? –

+1

また、最初にcollは断片化されていないと言いますが、後で、あなたも* shardedされた新しいコレクションで再度試してみると言います。最初のコレクションが断片化されているかどうか、なぜ出力コレクションをシャーディングするのかについて私を失ってしまいました。 –

+0

入力コレクションは除外されませんが、出力コレクションは除外されます。したがって、問題は次のとおりです。最初の断片化されたコレクションでは、出力は書き込まれませんが、2番目の断片化されたコレクションの出力は**書き込まれます。テスト目的のために、ここで小さな入力を使用して、何が起こっているのかをより簡単に確認できるようにしました。今後、より大きな入力でこれを行う予定です。また、既存のレコードを更新する(reduceで、http://docs.mongodb.org/manual/tutorial/perform-incremental-map-reduce/を参照)ことは非常に便利です。 – Mark

答えて

0

mapReduceは2レコードで実行され、結果として2レコードが出力されます。しかし、両方のシャードのpostProcessCountsでは、入力カウントは0のままです。

マップは2レコードで実行されます。これらの2つのレコードが異なるキーを持つ場合、Mapは2つのキーとそれぞれの値を出力します。これは正常です。

しかし、古いバージョンのMongoDB(あなたのケースではこれが当てはまるかどうかわかりません)に気付いたことは、reduceフェーズの "values配列"に長さがある場合、reduceはスキップされるということです。

最初のケースでは、出力コレクションは空白ですか?