Hadoop singleton pattern uasge



我正在尝试实现单例,它将缓存和验证 hadoop 中 map reduce 作业的配置。让我们将其命名为ConfigurationManager.

这是我现在所拥有的:

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

如您所见,它被设计为线程安全的。此外,它不是标准的单例:我将初始化和访问器方法分开,以便在调用get不强制存在 hadoop 的 Configuration 实例。因此,为了使用它,我过早地在Tool的祖先中调用init,然后尝试使用化简器中的get访问我的单例(就像这个ConfigurationManager.get().isSomethingEnabled()),但由于某些原因get返回null。有人可以解释一下这种行为吗?也许地图/化简器是作为单独的进程启动的?

每个reduce任务在不同的jvm上运行。这将解释空。

您可以在以下位置按归约任务执行此操作:减速器 - 配置

最新更新