2016-05-31 17 views
1

Ich benutze Hadoops Map reduce, um XML-Dateien zu analysieren. Also habe ich eine Klasse namens Parser, die eine Methode parse() haben kann, um die XML-Dateien zu analysieren. Und so sollte ich es in der Mapper's map() Funktion verwenden.Hadoop verwendet eine Instanz für jeden Mapper

Allerdings bedeutet es, dass jedes Mal, wenn ich eine Parser aufrufen möchte, ich eine Parser Instanz erstellen muss. Diese Instanz sollte jedoch für jeden Kartenjob identisch sein. Ich frage mich, ob ich diese Parser nur einmal instanziieren kann?

Und nur eine weitere Zusatzfrage, warum die Klasse immer statisch ist?

+1

In einer verteilten Computerumgebung, Instanzen einer Variablen zu teilen ist nicht möglich ... auch nicht sicher, ob der Mapper immer statisch ist. Wo siehst du das? –

+1

Scratch diese zweite Aussage ... Ich habe MapReduce nicht vor kurzem geschrieben, aber hier ist die Erklärung http://StackOverflow.com/Questions/11570674/Why-Declaring-Mapper-and-Reducer-Classes-as-static –

+0

In diesem Beispielcode, der Mapper ist eine statische Klasse. [link] (https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html) –

Antwort

3

Um eine Parserinstanz pro Mapper zu gewährleisten, verwenden Sie die Mapper-Setup-Methode, um Ihre Parserinstanz zu instanziieren und mithilfe der Bereinigungsmethode zu bereinigen.

Das gleiche gilt für den protobuf-Parser, den wir hatten, aber wir müssen sicherstellen, dass Ihre Parser-Instanz Thread-sicher ist und keine gemeinsamen Daten. Hinweis: Setup und Bereinigungsmethode werden nur einmal pro Mapper aufgerufen, so dass wir dort private Variablen initialisieren können. zu klären, was cricket_007 in sagte „In einer verteilten Computerumgebung, die gemeinsame Nutzung Instanzen einer Variablen ist nicht möglich ...“

we have a practice of reusing of writable classes instead of creating new writables every time we need. we can instantiate once and re-set the writable multiple times as described by Tip 6 Ähnlich auch Parser-Objekte wiederverwendet werden kann (Tip-6 Stil). wie im folgenden Code beschrieben. Für Ex:

private YourXMLParser xmlParser = null; 
    @Override 
     protected void setup(Context context) throws IOException, InterruptedException { 
      super.setup(context); 
      xmlParser= new YourXMLParser();   
     } 

    @Override 
     protected void cleanup(Mapper<ImmutableBytesWritable, Result, NullWritable, Put>.Context context) throws IOException, 
         InterruptedException { 
      super.cleanup(context); 
        xmlParser= null; 
    }