2017-01-16 1 views
0

Ich versuche, Singleton zu implementieren, die die Konfiguration von Kartenreduktionsjobs in hadoop zwischenspeichern und validieren wird. Nennen wir es ConfigurationManager. HierHadoop Singleton Muster uasge

ist, was ich habe jetzt:

public class ConfigurationManager { 
    private static volatile ConfigurationManager instance; 
    private static final String CONF_NAME = "isSomethingEnabled"; 
    private boolean isSomethingEnabled; 

    private ConfigurationManager(Configuration configuration) { 
     this.isSomethingEnabled= configuration.getBoolean(CONF_NAME, false); 
    } 

    public static void init(Configuration configuration) { 
     if (instance == null) { 
      synchronized (ConfigurationManager.class) { 
       if (instance == null) { 
        this.instance = new ConfigurationManager(configuration); 
       } 
      } 
     } 
    } 

    public static ConfigurationManager get() { 
     return instance; 
    } 

    public boolean isSomethingEnabled() { 
     return isSomethingEnabled; 
    } 
} 

Wie Sie sehen, es ist so konzipiert, Thread-sicher zu sein. Darüber hinaus ist es kein Standard-Singleton: Ich habe die Initialisierungs- und Zugriffsmethoden getrennt, um das Vorhandensein der Configuration Instanz von hadoop unter get nicht zu erzwingen. Um es zu benutzen, rufe ich vorzeitig init im Vorfahre von Tool an und versuche dann, auf mein Singleton unter Verwendung von get in Reduzierern zuzugreifen (wie dieses ConfigurationManager.get().isSomethingEnabled()), aber aus bestimmten Gründen getnull zurückgibt. Könnte jemand bitte ein solches Verhalten erklären? Vielleicht werden Maps/Reducer als separate Prozesse initiiert?

+0

Ich sehe keine Null-Argument 'get()' Methode. Und warum ist Hadoop für Ihre Frage relevant? – shmosel

+0

@smossel, Entschuldigung für Ungenauigkeit. Fest. Hadoop ist für meine Frage relevant, da dieser Code offensichtlich in einer isolierten Umgebung funktioniert (getestet). Ich arbeite nicht so schnell, wie ich es unter Bedingungen beschrieben habe, die ich beschrieben habe. –

+0

Also, wenn ich dich richtig verstanden habe, sagst du, du hättest 'get (Configuration)' aufgerufen, bevor du 'get()' aufgerufen hast und bist überrascht, null zu sehen. Wie haben Sie sichergestellt, dass der Initialisierer zuerst ausgeführt wird? – shmosel

Antwort

1

Jeder reduce-Task wird auf einem anderen jvm ausgeführt. Was würde die Null erklären.

Sie können es pro Aufgabe reduzieren: Reducer - configure