2017-02-04 5 views
3

Ich versuche, ein MapReduce-Programm zu implementieren wordcounts von 2 Dateien zu tun, und dann aus diesen Dateien, die die Wort zählt zu vergleichen, um zu sehen, was die häufigsten Wörter sind ...MapReduce Fragen

Ich bemerkte, dass nach tun wordcount für Datei 1, die Ergebnisse, die in das Verzeichnis "/ data/output1 /" gehen, gibt es 3 Dateien darin. - "_SUCCESS" - "_logs" - "Teil-r-00000" Die "Teil-r-00000" ist die Datei, die die Ergebnisse von Datei1 Wordcount enthält. Wie mache ich mein Programm diese bestimmte Datei lesen, wenn der Dateiname in Echtzeit generiert wird, ohne dass ich vorher den Dateinamen kenne?

Auch für die (Schlüssel, Wert) Paare habe ich einen "Identifier" zum "Wert" hinzugefügt, um in der Lage zu sein zu identifizieren, welche Datei und zählen das Wort gehört.

public void map(Text key, Text value, Context context) throws IOException, InterruptedException { 
      Text newValue = new Text(); 
      newValue.set(value.toString() + "_f2"); 
      context.write(key, newValue); 
} 

zu einem späteren Zeitpunkt, wie entferne ich die Kennung, so dass ich nur den "Wert" bekommen kann?

Antwort

1

Wenn Sie die Wortzählung aus zwei verschiedenen Dateien implementieren möchten, können Sie die multipleInput-Klasse verwenden, mit deren Hilfe Sie Map Reduce-Programme gleichzeitig auf beide Dateien anwenden können. Siehe diesen Link für ein Beispiel, wie man es implementiert http://www.hadooptpoint.com/hadoop-multiple-input-files-example-in-mapreduce/ hier werden Sie separate Mapper für jede Eingabedatei definieren, so dass Sie unterschiedliche Bezeichner in beiden Mapper-Datei hinzufügen können und dann, wenn dort Ausgabe zu Reducer geht, kann aus welcher Map-Datei diese Eingabe identifizieren kommt aus und kann entsprechend dazu verarbeiten. Und Sie können Identifier auf die gleiche Weise entfernen, wie Sie sie hinzufügen, zum Beispiel wenn Sie ein Präfix @ in Mapper 1 Ausgabeschlüssel und # in Mapper 2 Ausgabeschlüssel hinzufügen, dann können Sie in Reducer identifizieren, von welcher Karteneingabe dieses Präfix kommt und dann Sie können dieses Präfix in Reducer einfach entfernen.

Abgesehen von Ihrer anderen Abfrage im Zusammenhang mit dem Lesen von Dateien ist es einfach, dass der Name der Ausgabedatei immer ein Muster hat, dass wenn Sie hadoop1.x verwenden, das Ergebnis im Dateinamen als part-00000 und weiter gespeichert wird Das Ergebnis von hadoop 2.x wird im Dateinamen part-r-00000 gespeichert, wenn es einen anderen Ausgang gibt, der in denselben Ausgangspfad geschrieben werden muss, dann wird er in part-r-00001 und höher gespeichert. Andere zwei Dateien, die generiert werden, haben keine Bedeutung für Entwickler sie eher eine Hälfte für hadoop selbst

Hoffe das lösen Ihre Abfrage. Bitte kommentieren Sie, wenn die Antwort nicht klar ist.

3

Richten Sie einfach Ihren nächsten MR-Auftrag auf/data/output1 /. Es liest alle drei Dateien als Eingabe, aber _SUCCESS und _logs sind beide leer, so dass sie keinen Einfluss auf Ihr Programm haben. Sie sind nur so geschrieben, dass Sie erkennen können, dass der MR-Job, der in das Verzeichnis geschrieben wurde, erfolgreich beendet wurde.