Frage

Mit Blick auf die Kombination von MapReduce und HBase aus einem Datenstrom-Perspektive scheint mein Problem zu passen. Ich habe eine große Menge von Dokumenten, die ich auf Karte möchten, kombinieren und zu reduzieren. Meine bisherigen SQL-Implementierung war die Aufgabe in Batch-Operationen aufzuteilen, kumulativ zu speichern, was das Ergebnis der Karte in die Tabelle würde und dann die Durchführung der Äquivalent eines verringern. Dies hatte den Vorteil, dass während der Ausführung an einem beliebigen Punkt (oder zwischen Ausführungen), ich zu diesem Zeitpunkt die Ergebnisse der Karte hatte.

Wie ich es verstehe, läuft diesen Job als MapReduce würde alle der Map-Funktionen erfordert jedes Mal ausgeführt werden.

Meine Karten-Funktionen (und in der Tat jede Funktion) gibt immer die gleiche Leistung für einen gegebenen Eingang. Es gibt einfach keinen Punkt in Neuberechnung ausgegeben, wenn ich nicht haben. Mein Eingang (ein Satz von Dokumenten) kontinuierlich wird wachsen und ich werde meinen MapReduce Betrieb in regelmäßigen Abständen über die Daten läuft. Zwischen Ausführungen soll ich nur wirklich für neu hinzugefügte Dokumente, die die Kartenfunktionen berechnen.

Meine Daten werden wahrscheinlich HBase -> MapReduce -> HBase. Da Hadoop ist ein ganzes Ökosystem, kann es in der Lage sein zu wissen, dass eine gegebene Funktion mit einer bestimmten Identität zu einer Reihe angewandt wurde. Ich gehe davon aus unveränderlichen Einträge in der Tabelle HBase. Hat / Hadoop kann Rechnung tragen?

Ich bin darauf aufmerksam gemacht, aus der Dokumentation (vor allem der Cloudera Videos), die Neuberechnung (potenziell redundanter Daten) kann schneller sein als persistierende und für die Klasse von Problem abgerufen, die Hadoop für verwendet wird.

Alle Kommentare / Antworten?

War es hilfreich?

Lösung

Wenn Sie schauen, die Karte bei jedem Schritt laufen zu vermeiden, auszubrechen als eigene Schritt (entweder durch die IdentityReducer Verwendung oder die Anzahl der Reduzierungen für den Job auf 0 setzen) und spätere Schritte ausführen, um die Ausgabe des Verwendens Ihre Karte Schritt.

Ob dies tatsächlich schneller ist als neu berechnet aus den Rohdaten jeweils abhängig vom Volumen und die Form der Eingangsdaten im Vergleich zu den Ausgangsdaten, wie kompliziert Ihre Karte Schritt ist, etc.

Beachten Sie, dass Ihre Mapper auf neue Datensätze läuft nicht an früheren Läufen anhängen - aber Sie können mit einem datierten Ausgabeordner um dieses zu erhalten. Dies ist zu sagen, dass Sie die Ausgabe der Abbildung Ihre erste Charge von Dateien in my_mapper_output/20091101 speichern könnten, und die Charge in der nächsten Woche in my_mapper_output/20091108, etc. Wenn Sie den ganzen Satz zu reduzieren, über wollen, sollten Sie in der Lage sein, in my_mapper_output als das passiert Eingangsordner, und fangen alle Ausgangssätze.

Andere Tipps

Warum SQL-Workflow in einer anderen Umgebung nicht gelten? Bedeutung, fügen Tabelle eine „verarbeitet“ Spalte auf Ihre Eingabe. Wenn die Zeit eine Zusammenfassung zu laufen kommt, führen Sie eine Pipeline, die so etwas wie geht:

Karte (map_function) auf (Eingabetabelle gefiltert nach verarbeitet!); Speicher in map_outputs entweder in hbase oder einfach HDFS.

Karte (reduce Funktion) auf (map_outputs); Speicher in hbase.

Sie können das Leben ein wenig leichter machen, vorausgesetzt, Sie Ihre Daten in Hbase sind die Speicherung durch Insertion Datum sortiert, wenn Sie irgendwo Zeitstempel der erfolgreichen Zusammenfassung Läufe aufzeichnen, und öffnen Sie den Filter an den Eingängen, die später als letzte erfolgreiche Zusammenfassung datiert sind - Sie werden einige bedeutende Scan-Zeit speichern.

Hier ist eine interessante Präsentation, die zeigt, wie ein Unternehmen ihren Workflow architected (obwohl sie verwenden Hbase nicht wichtig): http: //www.scribd. com / doc / 20971412 / Hadoop-World-Production-Tief-Dive-mit-High-Availability

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top