Frage

Ich denke über eine kleine Testanwendung in hadoop Aufbau den Dreh des Systems zu erhalten.

Die Anwendung, die ich im Sinne habe zu tun Statistiken im Bereich sein. Ich möchte: „Die 10 schlechtesten Werte für jeden Schlüssel“ von meiner Minderer Funktion hat (wo ich die Möglichkeit, eine große Anzahl von Werten für einige Schlüssel übernehmen muß).

Was ich geplant habe, ist, dass die Werte, die in meinen Minderer gehen im Grunde die Kombination von „The Istwert“ und „Die Qualität / Relevanz des tatsächlichen Wertes“. Basierend auf der Relevanz ich „nur“ die 10 sie schlechtesten / besten Werte und Ausgang nehmen will vom Minderer.

Wie kann ich tun, um das zu tun (eine große Anzahl von Werten für einen bestimmten Schlüssel vorausgesetzt)? Gibt es eine Möglichkeit, dass ich alle Werte sortieren können, bevor sie in die Minderer gesendet werden (und einfach stoppen Sie den Eingang zu lesen, wenn ich die 10 zuerst gelesen haben) oder muss dies anders gemacht werden?

Kann jemand zeigen Sie mir hier auf ein Stück Beispielcode ich auf einen Blick haben kann?


Update: Ich fand zwei interessante Jira Fragen Hadoop-485 und < a href = "http://issues.apache.org/jira/browse/HADOOP-686" rel = "nofollow noreferrer"> Hadoop-686 .

Jeder hat ein Codefragment, wie diese 0,20-API in der Hadoop zu benutzen?

War es hilfreich?

Lösung

Es klingt wie Sie einen Combiner verwenden möchten, das, was mit den Werten Ihrer auf der Karte Seite erstellen, bevor sie an den Reducer gesendet werden, zu tun definiert, aber nachdem sie durch Schlüssel gruppiert sind. Der Kombinierer wird oft auf nur die Minderer Klasse (Sie auf der Karte Seite so reduzieren, und dann wieder auf der Verringerung dieser Seite).

Werfen Sie einen Blick darauf, wie das WORDCOUNT Beispiel verwendet die Kombinierer Teil zählt vorab zu berechnen:

http://wiki.apache.org/hadoop/WordCount


Update Hier ist, was ich im Sinn haben für Ihr Problem; es ist möglich, dass ich falsch verstanden, was Sie versuchen, wenn auch zu tun.

Jeder Mapper emittiert <key, {score, data}> Paare.

Der Kombinierer erhält eine Teilmenge dieser Paare: <key, [set of {score, data}> und macht einen lokalen Sortier (immer noch auf dem Mapper-Knoten) und gibt <key, [sorted set of top 10 local {score, data}]> Paare

.

Das Reduktionsmittel wird <key, [set of top-10-sets]> bekommen - das alles tun muss, ist die Zusammenführung Schritt der Art-Zusammenführung durchführt (keine Sortierung erforderlich) für jedes der Mitglieder der Wertemengen und Mischen stoppen, wenn die ersten 10 Werte gezogen werden.


Update 2

So, jetzt, da wir wissen, dass der Rang als cumilative und als Ergebnis können Sie die Daten früh nicht filtern, indem Kombinierer verwendet wird, ist das einzige, was zu tun, was Sie vorgeschlagen - bekommen eine sekundäre Sortier gehen. Sie haben die richtigen Tickets gefunden; gibt es ein Beispiel dafür, wie diese 20 in src / Beispiele in Hadoop zu tun / org / apache / hadoop / examples / SecondarySort.java (oder, wenn Sie nicht den gesamten Quellbaum herunterladen möchten, können Sie sich das Beispiel aussehen Patch in https://issues.apache.org/jira/browse/HADOOP-4545 )

Andere Tipps

Sounds endgültig wie ein SecondarySortProblem. Werfen Sie einen Blick in die „Hadoop: The Definitive Guide“, wenn Sie mögen. Es ist von O'Reilly. Sie können ihn auch online zugreifen. Es beschreiben sie eine ziemlich gute Umsetzung.

Ich setzte es von mir auch. Im Grunde funktioniert es so: Die Partitionierungs werden für alle Schlüssel-Wert-Paare mit dem gleichen Schlüssel Pflege zu einem einzigen Minderer gehen. Wir haben hier nichts Besonderes. Aber es gibt auch den GroupingComparator, die Gruppierungen bilden. Eine Gruppe ist eigentlich als Iterator übergeben zu einem () reduzieren - nennen. So eine Partition kann mehrere Gruppierungen enthalten. Aber die Menge der Partitionen sollte die Anzahl der Reduzierungen gleich sein. Aber die Gruppierung ermöglicht auch eine gewisse Sortierung zu tun, da es eine compareTo-Methode implementiert.

Mit dieser Methode können Sie steuern, dass die 10 besten / schlechtesten / höchste / niedrigste jedoch Tasten verkürzte erste erreichen. So, nachdem Sie diese 10 Tasten lesen, können Sie das Verfahren ohne weitere Iterationen reduzieren lassen.

Ich hoffe, das war hilfreich: -)

Wenn ich die Frage richtig zu verstehen, müssen Sie ein TotalOrderPartitioner .

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