2013-02-26 7 views
8

Wie es sich herausstellt MultipleTextOutputFormat wurde nicht auf die neue API migriert. Wenn wir also ein Ausgabeverzeichnis und eine Ausgabe auf Basis des im laufenden Betrieb geschriebenen Schlüsselwerts auswählen müssen, welche Alternative haben wir dann mit der neuen mapreduce API?MultipleTextOutputFormat Alternative in neue API

Antwort

4

Ich verwende AWS EMR Hadoop 1.0.3, und es ist möglich, verschiedene Verzeichnisse und Dateien basierend auf k/v-Paaren anzugeben. Verwenden Sie eine der folgenden Funktionen aus der MultipleOutputs Klasse:

public void write(KEYOUT key, VALUEOUT value, String baseOutputPath) 

oder

public <K,V> void write(String namedOutput, K key, V value, 
         String baseOutputPath) 

Der ehemalige write Methode den Schlüssel erfordert vom gleichen Typ wie der Kartenausgabeschlüssel zu sein (falls Sie diese verwenden im Mapper) oder der gleiche Typ wie der reduce output key (falls Sie diesen im Reducer verwenden). Der Wert muss auch in ähnlicher Weise eingegeben werden.

Letztere write Methode erfordert die Schlüssel/Wert-Typen festgelegt, welche Arten anpassen, wenn Sie Setup die MultipleObjects statischen Eigenschaften der addNamedOutput Funktion:

public static void addNamedOutput(Job job, 
           String namedOutput, 
           Class<? extends OutputFormat> outputFormatClass, 
           Class<?> keyClass, 
           Class<?> valueClass) 

Also, wenn Sie unterschiedliche Ausgabetypen als die benötigen Context verwendet , müssen Sie die letzte write Methode verwenden.

Der Trick, um verschiedene Ausgabeverzeichnisse bekommen ist eine baseOutputPath zu übergeben, die ein Verzeichnis Separator enthält, wie folgt aus:

multipleOutputs.write("output1", key, value, "dir1/part"); 

In meinem Fall diese Dateien "dir1/Teil-r-00000" genannt erstellt.

war ich nicht erfolgreich ein baseOutputPath in Verwendung, die das .. Verzeichnis enthält, so dass alle baseOutputPath s in dem Pfad zu dem -output Parameter übergeben streng enthalten sind.

Weitere Einzelheiten zur Einrichtung und richtigen Verwendung von MultipleOutputs finden Sie in diesem Code, den ich gefunden habe (nicht meins, aber ich fand es sehr hilfreich; verwendet keine anderen Ausgabeverzeichnisse). https://github.com/rystsov/learning-hadoop/blob/master/src/main/java/com/twitter/rystsov/mr/MultipulOutputExample.java

+0

Ich habe vergessen zu erwähnen, dass ich getestet habe, die 'baseOutputPath' basierend auf Schlüssel/Wert-Daten zu variieren, und es erfolgreich in verschiedenen Dateien ausgegeben. – Eddified

+0

Ich bin froh, dass du es erwähnt hast, ich hatte es irgendwann herausgefunden :) – Amar

+0

Vielen Dank für den "dir1/part" -Teil, hätte nicht gedacht! – ssgao

0

Ähnlich: Hadoop Reducer: How can I output to multiple directories using speculative execution?

Grundsätzlich können Sie auf HDFS schreiben direkt von Ihrem Minderer - Sie müssen nur von einer spekulativen Ausführung vorsichtig sein und Ihre Dateien eindeutig benennen, dann werden Sie Sie besitzen OutputCommitter implementieren müssen um die abgebrochenen Versuche zu bereinigen (dies ist der schwierigste Teil, wenn Sie wirklich dynamische Ausgabeordner haben - Sie müssen durch jeden Ordner gehen und die Versuche löschen, die mit abgebrochenen/fehlgeschlagenen Aufgaben verbunden sind). Eine einfache Lösung für dieses Problem ist die spekulative Ausführung

+0

Das klingt nicht einfach: P Eine mögliche Lösung für MultipleTextOutputFormat? Oder können wir etwas wie MultipleTextOutputFormat mit der neuen API implementieren? – Amar

+0

Wie im javadoc von mehreren Ausgaben angegeben, fügte ich den folgenden Code in meinem Job und Reduzierer hinzu und es funktioniert gut. In dem Job: MultipleOutputs.addNamedOutput (job, namedoutputstring, outputformatclass, keyclass, valueclass); Im Reduzierer: mos = neue MultipleOutputs (Kontext); ... /* zur Laufzeit berechnet */baseoutput = "abc/xyz/Dateiname"; mos.write (Schlüssel, Wert, BasisOutput); – techuser

+0

nicht vergessen mos.close() in Aufräumen(). –

-1

Für die beste Antwort zu deaktivieren, lesen Sie auf Hadoop -. (. Start pg 253.) Definitive Guide 3. Ed

Ein Auszug aus dem Buch HDG -

"In der alten MapReduce-API gibt es zwei Klassen zum Erzeugen mehrerer Ausgaben: MultipleOutputFormat und MultipleOutputs. Kurz gesagt, MultipleOutputs ist ausführlicher, aber MultipleOutputFormat hat mehr Kontrolle über die Ausgabeverzeichnisstruktur und Dateinamen. MultipleOutputs in der neuen API kombiniert die besten Funktionen der beiden multiplen Ausgabeklassen in der alten API. "

Es hat ein Beispiel, wie Sie Verzeichnisstruktur, Dateibenennung und Ausgabeformat mit MultipleOutputs API steuern können.

HTH.

+0

Ermöglicht MultipleOutputs, den Namen oder den Dateinamen des Ausgabeordners auf der Basis von Schlüssel/Wert-Paaren zu bestimmen? Ich denke nicht, wenn es einen Weg gibt, lass es mich freundlich wissen. – Amar

+0

Yeah Alter und ich konnte es nicht finden! Mit MultipleOutputs können Sie nur in einen * Satz * von * vordefinierten * Dateipfaden schreiben. Und Sie tun dies, indem Sie 'MultipleOutputs.addNamedOutput()' in Ihrem 'run()' verwenden. Es ist möglich, dass ich hier etwas vermisse, aber lieber als solche Aussagen zu machen, wenn es * anderswo leicht zu finden ist, hättest du wenigstens einen Link darauf schreiben können. – Amar

+0

Ich bezweifle auch, dass Sie entweder MultipleTextOutputFormat oder MultipleOutputs verwendet haben! Wenn man das Buch liest, sagt es deutlich vor dem Beispiel: * Im Vergleich zu MutipleTextOutputFormat gibt es bei der Verwendung von MultipleOutputs * weniger Kontrolle über die Benennung der Ausgaben. – Amar

Verwandte Themen