2013-06-06 10 views
11

Stavo cercando di usare MongoDB 2.4.3 (anche provato 2.4.4) con mapReduce su un cluster con 2 frammenti con ogni 3 repliche. Ho un problema con i risultati del lavoro mapReduce che non vengono ridotti alla raccolta di output. Ho provato un Incremental Map Reduce. Ho anche provato a "fondere" invece di ridurre, ma non ha funzionato.MapReduce in MongoDB non emette

La mappa ridurre comando Esegui Mongos: (Coll non è sharded)

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

che produce il seguente risultato:

{ 
    "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, 
} 

Così vedo che il MapReduce viene investito 2 record, che danno luogo a 2 record emessi. Tuttavia nei postProcessCounts per entrambi i frammenti il ​​conteggio degli input rimane 0. Anche provare a trovare il record con una ricerca su _id non produce alcun risultato. Nel file di registro di MongoDB non sono riuscito a trovare messaggi di errore relativi a questo.

Dopo aver tentato di riprodurlo con una raccolta di output appena creata, che ho anche aggiunto a hash _id e ho anche fornito gli stessi indici, non ero in grado di riprodurlo. Quando si emette lo stesso ingresso a una raccolta diversa

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

Il risultato viene memorizzato nella raccolta di uscita e ho ottenuto il seguente risultato:

{ 
    "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, 
} 

Quando si esegue nuovamente lo script con lo stesso ingresso ouputting nuovo in la seconda raccolta, mostra che si sta riducendo in postProcessCounts. Quindi la mappa e le funzioni di riduzione fanno bene il loro lavoro. Perché non funziona sulla prima raccolta più grande? Sto facendo qualcosa di sbagliato qui? Esistono limitazioni speciali sulle collezioni che possono essere utilizzate come output per la riduzione della mappa?

+0

per semplicità, poiché questa raccolta non è sharded (ed è piccola) perché non si esegue mapreduce in una raccolta di output non condivisa? –

+1

anche inizialmente dici che coll non è sharded ma in seguito dici di provare di nuovo con una nuova collezione che * anche * è stata sharked. quindi mi hai perso se la raccolta iniziale è stata tagliata e perché stai condividendo la raccolta di output. –

+0

La raccolta di input non è sharded, ma le collezioni di output sono. Quindi, il problema è: nella prima raccolta ombreggiata non viene scritto alcun output, sebbene nel secondo output di raccolta sfumato ** sia ** scritto. A scopo di test ho usato un piccolo input qui per rendere più facile vedere cosa sta succedendo, stavo programmando di farlo con input più grandi in futuro. Inoltre, l'aggiornamento dei record esistenti (con riduci, vedi http://docs.mongodb.org/manual/tutorial/perform-incremental-map-reduce/) è molto conveniente. – Mark

risposta

0

mapReduce viene eseguito su 2 record, che genera 2 record in uscita. Tuttavia nei postProcessCounts per entrambi i frammenti il ​​conteggio degli input rimane 0.

La mappa viene eseguita su 2 record. Se quei due record hanno una chiave diversa, la Mappa emetterà 2 chiavi e un valore per ciascuna. Che è normale

Ma qualcosa che ho notato in una versione precedente di MongoDB (non sono sicuro se ciò si applica nel tuo caso) è che se la "matrice di valori" per la fase di riduzione ha una lunghezza, la riduzione verrà saltata.

La raccolta di output è vuota nel primo caso?