2017-01-16 5 views
0

Я пытаюсь реализовать singleton, который собирается кэшировать и проверять конфигурацию карты, уменьшая задания в hadoop. Назовите его ConfigurationManager.Hadoop singleton pattern uasge

Вот что у меня есть на данный момент:

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; 
    } 
} 

Как вы можете видеть, что это предназначено, чтобы быть потокобезопасным. Кроме того, он не является стандартным одноэлементным: я разделял инициализацию и методы доступа, чтобы не применять присутствие экземпляра hadoop Configuration на вызове get. Поэтому, чтобы использовать его, я преждевременно вызываю у предка Tool, а затем пытаюсь получить доступ к моему синглтону, используя get в редукторах (например, ConfigurationManager.get().isSomethingEnabled()), но по некоторым причинам get возвращает null. Может ли кто-нибудь объяснить, пожалуйста, такое поведение? Может быть, карты/редукторы инициируются как отдельные процессы?

+0

Я не вижу никакой нулевой аргумент 'получить()' метод. И почему hasoop имеет отношение к вашему вопросу? – shmosel

+0

@shmosel, извините за неточность. Исправлена. Hadoop имеет отношение к моему вопросу, потому что obvoiusly этот код работает в изолированной среде (проверял это). Я не работаю, как только я помещаю это в описанные мной условия. –

+0

Итак, если я правильно вас понял, вы говорите, что вы вызвали 'get (Configuration)' перед вызовом 'get()' и удивлены, увидев нуль. Как вы гарантировали, что инициализатор будет работать первым? – shmosel

ответ

1

Каждая задача сокращения выполняется на другом jvm. Который объяснил бы null.

Вы можете сделать это за уменьшить задачу: Reducer - configure