Filtern von input-Dateien mit globStatus in MapReduce
Ich habe eine Menge von input-Dateien und die möchte ich verarbeiten ausgewählte Elemente basierend auf dem Datum, das angefügt wurde, in das Ende. Ich bin jetzt verwirrt, wo muss ich die globStatus Methode zum filtern der Dateien.
Habe ich eine benutzerdefinierte RecordReader Klasse, und ich versuchte zu verwenden globStatus in seiner nächsten Methode, aber es hat nicht funktioniert.
public boolean next(Text key, Text value) throws IOException {
Path filePath = fileSplit.getPath();
if (!processed) {
key.set(filePath.getName());
byte[] contents = new byte[(int) fileSplit.getLength()];
value.clear();
FileSystem fs = filePath.getFileSystem(conf);
fs.globStatus(new Path("/*" + date));
FSDataInputStream in = null;
try {
in = fs.open(filePath);
IOUtils.readFully(in, contents, 0, contents.length);
value.set(contents, 0, contents.length);
} finally {
IOUtils.closeStream(in);
}
processed = true;
return true;
}
return false;
}
Ich weiß, es gibt eine "FileStatus" array, aber wie kann ich es verwenden, um die Dateien zu filtern. Kann jemand bitte etwas Licht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
globStatus
Methode nimmt 2 Kostenlose Argumente, mit denen Sie zum filtern Ihrer Dateien. Die erste ist die glob-Muster, aber manchmal glob-Muster sind nicht stark genug, um zu filtern, dass bestimmte Dateien, in dem Fall kann man definierenPathFilter
.Bezüglich der glob-Muster, die unterstützt werden:
PathFilter
ist einfach eine Schnittstelle wie diese:So können Sie diese Schnittstelle implementieren und umsetzen der
accept
Methode, wo Sie Ihre Logik, um Dateien filtern.Ein Beispiel, genommen von Tom White ausgezeichneten Buch, die Ihnen erlaubt zu definieren, eine
PathFilter
zum filtern von Dateien mit einem bestimmten regulären Ausdruck:Können Sie direkt filtern Sie Ihre Eingabe mit einem
PathFilter
Umsetzung durch den AufrufFileInputFormat.setInputPathFilter(JobConf, RegexExcludePathFilter.class)
beim initialisieren Sie Ihren job.BEARBEITEN: Da müssen Sie die Klasse in
setInputPathFilter
können Sie nicht direkt Argumente, aber Sie sollten in der Lage sein, etwas ähnliches zu tun, indem er mit derConfiguration
. Wenn Sie IhreRegexExcludePathFilter
erstrecken sich auch ausConfigured
, Sie können Holen Sie sich zurückConfiguration
Objekt, das Sie müssen initialisiert werden, bevor mit der gewünschten Werte, so können Sie diese Werte in Ihrem filter und verarbeiten Sie in denaccept
.Zum Beispiel, wenn Sie initialisiert werden, wie diese:
Anschließend definieren Sie Ihren filter wie dieser:
EDIT 2: Es gab ein paar Probleme mit dem original-code finden Sie in der aktualisierten Klasse. Sie müssen auch entfernen Sie den Konstruktor, da es nicht mehr benutzt wird, und überprüfen Sie, ob das Verzeichnis, in dem Fall sollten Sie true zurück, so wird der Inhalt des Verzeichnisses gefiltert werden können, zu.
FileInputFormat.setInputPathFilter(JobConf, PathFilter)
ermöglichen sollte, die Sie zum filtern Ihrer Eingabe, die Sie nicht wirklich brauchen eine recordreader nur für die.FileInputFormat.setInputPathFilter(JobConf, RegexIncludePathFilter.class);
statt.RegexExcludePathFilter
Klasse, so dass Sie nicht brauchen, um passieren alles für den Konstruktor, der sollte den trick tun.Für alle, die dies Lesen, kann ich sagen "bitte tun Sie nichts mehr komplexe in den Filter als Validierung der Wege". Speziell: nicht-Schecks für die Dateien eines Verzeichnisses, die immer Ihre Größen, etc. Warten Sie, bis die Liste/glob Betrieb zurückgekehrt ist und dann eine Filterung es, mithilfe der Informationen, die jetzt in den besiedelten
FileStatus
Einträge.Warum? Alle diese Aufrufe zu
getFileStatus()
direkt oder überisDirectory()
tun, unnötige Anrufe zu dem Dateisystem-Aufrufe, die Beurteilung unnötig namenode Last auf einem HDFS-cluster. Mehr kritisch, gegen die S3-und anderen Objekt speichert jeden Vorgang möglicherweise macht mehrere HTTPS-Anfragen —und diejenigen, die wirklich tun, nehmen Sie messbare Zeit. Noch besser, S3 Drosselklappe, wenn Sie denkt, dass Sie zu viele Anfragen über Ihre gesamte Rechner-cluster. Das wollen Sie nicht.Witz, bis nach dem Aufruf —der Datei-status-Einträge, die Sie zurück bekommen, sind diejenigen, die aus dem Objekt speichern die Liste der Befehle, die in der Regel zurück, Tausende von Datei-Einträge per HTTPS-request, und so sind effizienter.
Für weitere Informationen, überprüfen Sie die Quelle der
org.apache.hadoop.fs.s3a.S3AFileSystem
.