2016-06-28 9 views
1

Ich stieß auf eine Post, in der ich mich erkundigte, wie man einen Dateinamen von mapreduce verarbeiten lassen kann. Das lässt mich fragen, unter welchen Umständen wir den Namen oder den Pfad der Datei wissen müssen, die gerade verarbeitet wird.Warum müssen wir den Namen der Datei wissen, die in mapreduce verarbeitet wird?

FileSplit fileSplit = (FileSplit) context.getInputSplit(); 

String fileName = fileSplit.getPath().getName(); 

Dank Basam

Antwort

0

Interessante Frage.

Sagen Sie brauchen, um effizient einzigartige Integer-ID basiert auf Mapper zu generieren, wie es hier geschehen ist. Unique Key generation in Hive/Hadoop

Vielleicht haben Sie einen ganz anderen Grund, die Mapper-ID zu verwenden (zurückgegeben durch context.getTaskAttemptID() getTaskID() .getId())

Das Problem mit der Zuordnungsaufgaben-ID ist, dass es nicht deterministisch basierend auf Eingabedatei zugeordnet ist.

Zum Beispiel Ihrer Mapper-Eingabedateien führen vielleicht einen vorhergehenden Minderer und sagen Sie 10 von Eingang Partitionen haben:

Ausgabe-r-00000 Ausgabe-r-00001 ... Ausgabe-r- 00009

Nun müssen Sie diese Daten einem Mapper zuführen und benötigen möglicherweise eine ID des Mappers, die direkt mit dem Index der Eingabedatei übereinstimmt.

Normalerweise wird in diesem Fall zunächst die Aufteilung der Eingänge deaktiviert, damit jeder Mapper seine eigene Partition vollständig verarbeiten kann.

Aber wie ich bereits sagte Mapper nicht deterministisch zugeordnet sind, so dass Sie nicht auf context.getTaskAttemptID verlassen können() getTaskID() getId():..

Manchmal 0 Mapper wird output-r-00000, verarbeiten manchmal Ausgang -r-00001 und so weiter.

Um eine benutzerdefinierte Mapper-ID deterministisch zu erstellen, können Sie den Namen der Eingabedatei verwenden, den Sie analysieren können, um den Partitionsindex abzurufen.

+0

vielen Dank für die ausführliche Erklärung Yurgis. Gibt es ein Beispielprogramm, das Sie mir vorschlagen können? –

1

Es gibt mehrere Situation, wo der Name der Datei ist wichtig, mit gutem Beispiel:

  1. Der Zeitstempel im Dateinamen in dem Prozess erforderlich ist.
  2. Je nach Dateiname können Sie die Datei anders verarbeiten. Wie wenn Sie zwei sehr ähnliche Dateitypen haben, die einen ähnlichen Prozess mit kleinen Unterschieden erfordern (falls nicht, ist es möglicherweise besser, zwei verschiedene mapreduce-Jobs zu haben).
  3. Wenn Sie zusätzlich zu dem Prozess möchten Sie den Namen der verarbeiteten Dateien verfolgen.
  4. usw.