MapReduce mit MongoDB wirklich, wirklich langsam (30 Stunden vs 20 Minuten in MySQL für eine gleichwertige Datenbank)

8

Ich mache jetzt einige Daten analysieren Tests und in der ersten, wirklich einfach habe ich sehr seltsame Ergebnisse.

Die Idee ist folgende: aus einem Internet-Zugangsprotokoll (eine Sammlung mit einem Dokument für jeden Zugriff, für die Tests 90 Millionen Dokumente). Ich möchte die Anzahl der Zugriffe nach Domäne (was eine GROUP BY in MySQL sein wird) und die 10 am häufigsten verwendeten Domänen

erhalten

Das Skript, das ich in JavaScript gemacht habe, ist wirklich einfach:

%Vor%

Das Äquivalent in MySQL ist:

%Vor%

Nun, MongoDB braucht 30 Stunden, um die Ergebnisse und MySQL 20 Minuten zu erhalten! Nachdem ich ein wenig gelesen habe, bin ich zu dem Schluss gekommen, dass wir für die Datenanalyse Hadoop verwenden müssen, da MongoDB sehr langsam ist . Die Antworten auf Fragen wie diese sagen:

  • MongoDB verwendet nur Thread
  • Javascript ist einfach zu langsam

Was mache ich falsch? Sind diese Ergebnisse normal? Sollte ich Hadoop verwenden?

Wir machen diesen Test für die folgende Umgebung:

  • Betriebssystem: Suse Linux Enterprise Server 10 (Virtueller Server auf Xen)
  • RAM: 10 GB
  • Kerne: 32 (AMD Opteron Prozessor 6128)
Ciges 27.08.2012, 09:13
quelle

3 Antworten

12

Ich habe diese Frage sehr ähnlich beantwortet vorher. Die Einschränkungen von Map Reduce in MongoDB wurden bereits erwähnt - wie Sie bereits erwähnt haben, ist es single-threaded, es muss in Java Script (spidermonkey) und zurück etc. konvertiert werden.

Deshalb gibt es andere Möglichkeiten:

  1. Der MongoDB Hadoop Connector (offiziell unterstützt)
  2. Das Aggregations-Framework (erfordert 2.1 +)

Zum jetzigen Zeitpunkt war die stabile Version 2.2.0 noch nicht veröffentlicht, aber es lag an RC2, also sollte die Veröffentlichung bevorstehen. Ich würde empfehlen, es als sinnvoller Vergleich für diese Art von Tests zu versuchen.

    
Adam Comerford 27.08.2012 10:04
quelle
5

Scheinbar funktioniert die Gruppenfunktion im Aggregations-Framework gut! : -)

Der folgende Javascript-Code ruft die 10 meistbesuchten Domains mit ihren Besuchen in 17m17s ab!

%Vor%

Jedenfalls verstehe ich immer noch nicht, warum die MapReduce-Alternative so langsam ist. Ich habe die folgende Frage im MongoDB JIRA geöffnet.

    
Ciges 28.08.2012 08:50
quelle
0

Ich denke, Ihr Ergebnis ist ganz normal und wird versuchen, sie zu rechtfertigen. & lt; .br & gt; 1. MySQL verwendet ein Binärformat, das für die Verarbeitung optimiert ist, während MongoDB mit JSON arbeitet. So wird die Zeit der Analyse zur Verarbeitung hinzugefügt. Ich würde schätzen, dass es mindestens 10x faktorisiert.
2. JS ist in der Tat viel langsamer als C. Ich denke, mindestens Faktor 10 kann angenommen werden. Zusammen ergeben wir ungefähr x100 - ähnlich wie Sie sehen. 20 Minuten x 1000 sind 2000 Minuten oder etwa 33 Stunden.
3. Hadoop ist auch nicht effizient für die Datenverarbeitung, aber es ist in der Lage, alle Kerne zu verwenden, die Sie haben, und es macht einen Unterschied. Java hat JIT auch für mehr als 10 Jahre entwickelt und optimiert.
4. Ich würde vorschlagen, nicht auf MySQL, sondern auf TPC-H Benchmark Q1 zu schauen - was eine reine Aggregation ist. Ich denke Systeme wie VectorWise zeigen den maximal möglichen Durchsatz pro Kern.

    
David Gruzman 27.08.2012 19:55
quelle

Tags und Links