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 get
null
zurückgibt. Könnte jemand bitte ein solches Verhalten erklären? Vielleicht werden Maps/Reducer als separate Prozesse initiiert?
Ich sehe keine Null-Argument 'get()' Methode. Und warum ist Hadoop für Ihre Frage relevant? – shmosel
@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. –
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