Laufende Karte: Reduziert den Auftrag für bestimmte Dateien / Blöcke in HDFS

8

Zuallererst, ich bin neu in hadoop:)

Ich habe einen großen Datensatz von gezippten Dateien (TBs von Dokumenten in gezippten Dateien in der Größe von jeweils 100-500mb).

Im Grunde brauche ich eine Art Filterung meiner Eingabe für meine Map-Reduce-Jobs.

Ich möchte diese Dateien auf verschiedene Arten analysieren. Viele dieser Jobs müssen nur Dateien eines bestimmten Formats (bestimmter Länge, mit bestimmten Wörtern usw. - alle möglichen willkürlichen (invertierten) Indizes) analysieren, und es dauert unverhältnismäßig lange, das gesamte Dataset für jeden Job zu verarbeiten. Daher möchte ich Indizes erstellen, die auf bestimmte Blöcke / Dateien in HDFS zeigen.

Ich kann die benötigten Indizes manuell erzeugen, aber wie definiere ich genau, welche (tausende) spezifischen Dateien / Blöcke ich als Eingabe für Mapper verarbeiten möchte? Kann ich dies tun, ohne die Quelldaten in z.B. HBase? Will ich? Oder gehe ich dieses Problem völlig falsch an?

    
jkgeyti 21.06.2013, 10:53
quelle

3 Antworten

2

Wenn Sie wissen, welche x-Dateien in einem großen Dateikorpus verarbeitet werden sollen, können Sie bei der Konfiguration Ihres Jobs die Methode org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPathFilter(Job, Class<? extends PathFilter>) verwenden.

Sie müssen eine Klasse übergeben, die PathFilter implementiert. Hadoop erstellt eine neue Instanz dieser Klasse und es wird jede Datei im Korpus über die Methode boolean accept(Path path) dargestellt. Sie können dies verwenden, um die Dateien auf tatsächliche Prozesszuordnungsaufgaben zu filtern (ob diese auf dem Dateinamen, der Größe, dem Zeitpunkt der letzten Änderung usw. basieren).

Um auf bestimmte Blöcke zu zielen, müssen Sie eine eigene Erweiterung von FileInputFormat implementieren, die speziell die Methode getSplits überschreibt. Diese Methode verwendet die listStatus -Methode, um zu ermitteln, welche Eingabedateien verarbeitet werden sollen (und an welcher Stelle der zuvor erwähnte PathFilter aufgerufen wird). Anschließend bestimmt sie, wie diese Dateien in Splits aufgeteilt werden (wenn die Dateien teilbar sind). In dieser getSplits -Methode müssen Sie also erneut Ihre Referenzdaten verwenden, um auf die spezifischen Splits abzuzielen, an denen Sie interessiert sind.

Um diese Zieldatei zu speichern / abzurufen und Informationen zu teilen, haben Sie verschiedene Möglichkeiten des Persistenzspeichers, wie zB einen Schlüssel / Wertspeicher (HBase, wie Sie in Ihrer Frage notiert haben), eine separate Datenbank (MySQL, etc) invertierter Index (Lucene) usw.

    
Chris White 22.06.2013, 13:01
quelle
2

Da Sie die Eingabe basierend auf dem Dateiinhalt (Datei mit dem Wort foobar ) und nicht mit den Metadaten (Dateiname / -größe usw.) filtern möchten, benötigen Sie diese Art von Datei Indizes, die ich basierend auf Hadoop InputSplit erstellt habe. Siehe meinen Blog

    
Antoine Amend 10.09.2014 22:32
quelle
1

Running Map-Reduce-Job für bestimmte Dateien in HDFS bedeutet, dass die Eingabedatei anhand einiger Kriterien herausgefiltert wird. Hier ist ein guter Blog von Antoine Amend , wird hilfreich sein.

    
shashaDenovo 28.05.2014 11:19
quelle

Tags und Links