2012-07-31 12 views
5

Während der Entwicklung unserer Karten reduzieren Stellen aus MR-Code nützliche diagnostische Datenstrukturen unabhängig von der Datenkarte ist reduzierten erzeugt. Gibt es eine einfache Möglichkeit, diese Daten an den Code zu senden, der mapReduce aufgerufen hat, oder sie in Mongo persistent zu machen? Nur das Schreiben in die Log-Datei erweist sich als sehr suboptimal, da (a) dort bereits viele Daten vorhanden sind und (b) unsere Diagnoseinformation sehr strukturiert ist und wir in der Tat Abfragen ausführen möchten es.MongoDB: verkleinern Nebenwirkungen

Meine Untersuchung bisher legt nahe, dass MR-Datenstrukturen von Wert übergeben werden (über die Serialisierung) so dass jeder im Speicher befindlichen Datenstrukturen verloren sind, auf den „globalen“ scope verhakt einschließlich. Die Namespaces sind vom JS serverseitigen Hauptnamespace isoliert, so dass dbeval sie scheinbar nicht erreichen kann (oder zumindest weiß ich nicht, wo ich suchen soll). Last but not least, obwohl die alle Datenbankobjekte und Funktionen vorhanden sind, wird 10gen (verwirrend) Fehlermeldungen zu erzeugen, deren Nutzung zu verhindern, beispielsweise etwa coll.insert keine Funktion während typeof coll.insert === 'function' ist true zu sein.

klar sein, ich bin für die Entwicklung in einem einzigen Knoten dabei daran interessiert, weil die Protokollierung/Debugging-Unterstützung in MongoDB ziemlich begrenzt ist. Diese Art von Nebenwirkungen ist in Produktionsumgebungen nicht gut.

+0

Genau welche Art von Daten erzeugt es? Die Ausgabe von MR kann in einer Sammlung beibehalten werden. In C# gebe ich Folgendes an: MyInputCollection.MapReduce (map, reduce, MapReduceOptions.SetOutput ("MyOutputCollection")); Sie lesen dann aus der persistenten Sammlung 'MyOutputCollection'. –

+0

Ich möchte Informationen speichern, die unabhängig von der MR-Ausgabe sind. Stellen Sie es sich als Datenabzug vor, z. B. für detaillierte strukturierte Protokollierungs-/Benchmarking-Informationen, die ich mit Code verarbeiten möchte, damit ich nicht möchte, dass sie in den Protokolldateien landen. – Sim

+0

Haben Sie versucht, mit einer Capped-Auflistung für die Protokollierung .. Ich verstehe nicht ganz, warum coll.insert sollte fehlschlagen. –

Antwort

2

Wie vermutet, ist es nicht möglich ist (wie bei MongoDB 2.2), um einen anderen DB Zugriff von innerhalb der Map/Reduce-Funktionen. Abgesehen von potenziellen Auswirkungen auf die Performance besteht auch die Möglichkeit, Deadlocks und andere unerwünschte Nebenwirkungen zu erzeugen.

Leider lässt, dass print() zum Mongo Protokoll als einzige „out-of-Band“ Ausgabeoption.

Je nach Diagnoseausgang, ein Ansatz wäre, zu versuchen:

  • eine eindeutige Markierung hinzufügen, die Sie die Ausgabe (oder sogar den Ausgabelauf) in der Protokollausgabe

  • zu identifizieren, würde es ermöglichen
  • serialisiert Ihre Ausgabe mit tojson() so ist es mit einigen parseable Struktur angemeldet und im Idealfall auf einer einzigen Zeile emittiert wird, wenn Sie print()

  • ein Skript zu schreiben tail die mongod.log log für Linien mit Ihrer einzigartigen Marker passende und diejenigen in eine andere Sammlung einfügen für die Berichterstattung

Beispiel Code, der aus einer M/R-Funktion ausgeführt wird:

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

Beispiel Ausgabe:

$ 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

das ist mehr oder weniger was wir getan haben.Ich habe eine Logger-Klasse erstellt, die sich bei einer Sammlung anmeldet und print() verwendet. Während der MR erzeugen die Log-Sammeleinsätze Ausnahmen, die verschluckt werden. Ich wünschte, dass 10gen der Entwicklung/Fehlersuche mehr Aufmerksamkeit schenkte. – Sim

+0

@Sim: wäre hilfreich, wenn Sie ein [Jira-Problem] (https://jira.mongodb.org/browse/SERVER) im MongoDB-Tracker (SERVER-Warteschlange, Komponente 'MapReduce/Distinct/Group') mit einigen erstellen könnten Weitere Informationen darüber, was zum Debuggen benötigt/nützlich ist. Vielleicht etwas Ähnliches wie Hadoop [MapReduce Counters] (http://diveintodata.org/2011/03/15/an-example-of-hadoop-mapreduce-counter/), mit einem optionalen Logging-Output-Callback am Ende des Laufs . – Stennie