2016-06-30 11 views
0

Ich weiß, dass Sie zwei Mapper der gleichen Datei erzeugen können, wenn Sie die addinputpath -Funktion zweimal mit dem gleichen Pfad eingeben, aber ich möchte, dass die Datei jedes Mal etwas anders verarbeitet wird.Eine Datei zweimal mit verschiedenen Parametern lesen

Insbesondere möchte ich jedes Mal verschiedene Parameter verwenden, die ich durch die Job-Klasse (mit configuration.set/get) übergeben habe. Wenn die Dateien unterschiedlich sind, erhalte ich den Pfad/Namen der Datei, indem ich die context/inputsplit-Klassen verwende, um das zu erreichen, aber jetzt, da sie dieselben sind, kann ich sie nicht unterscheiden. Irgendwelche Gedanken?

Jeder Mapper ist eine andere Maptask, aber ich habe keine Ahnung, ob ich irgendwelche Informationen über die Maptasks verwenden kann. Ich kenne auch nicht die Reihenfolge, in der das Framework Eingaben in maptasks einteilt - es könnte nützlich sein.

Alternativ könnte ich die Datei kopieren (unter einem anderen Namen), aber das wäre eine Verschwendung von Ressourcen

Antwort

0

Ich musste die Inputsplit und Inputformat-Klassen (Fileinputformat und Filesplit für die Bequemlichkeit) überschreiben.

Ich hinzugefügt und extra Feld in der Filesplit zu unterscheiden, welche Zeit eine Teilung gelesen wird. Es funktioniert gut

0

ich Sie empfehlen, diese Logik in den Mapper zu setzen. Es wird effizienter sein, als wenn Hadoop dieselbe Datei zweimal scannt und verarbeitet.

So Pseudo-Code wie das sein würde:

map(key, value, context) { 

    //do something with this key/value 
    ... 
    //emit output 1 
    context.write(...) 

    //do something else with this the same key/value 
    ... 
    //emit output 2 
    context.write(...) 
} 

Wenn Sie Ihren Ausgang 1 und 2 müssen verschiedene Reduzierungen abgefertigt werden, müssen Sie Ihre Ausgabeschlüssel Handwerk zu tun.

+0

Das Problem ist, dass die/* etwas mit diesem Schlüssel Wert */kostet eine Menge und damit die emittiert müssen parallel passieren. Gibt es wirklich keine andere Möglichkeit, zwei Lesevorgänge derselben Datei zu unterscheiden? – user3161227

+0

Wie wäre es, es in zwei Threads laufen zu lassen und auf beide zu warten? Hadoop kann sowieso mehrere Mapper auf demselben Knoten ausführen, so dass es eigentlich keinen großen Unterschied macht. – yurgis

+0

Wenn Sie denken/* etwas mit diesem Schlüsselwert */kosten, führen Sie mehr Mapper aus, um die beste Parallelität zu erreichen. Auch wenn ein Mapper Ausgabe 1 schreibt, schreibt die andere Ausgabe2. Der obige Ansatz sieht am besten aus, da es vermeidet, dass IO zweimal ausgeführt wird, was ein großartiger Leistungsverstärker ist. Zweitens ist es nicht möglich, zwischen zwei Dateien zu unterscheiden und verschiedene Parameter in demselben MR-Job aufzunehmen. –