我正在尝试实现singleton,它将在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,然后尝试在reducers中使用get来访问我的单例(比如这个ConfigurationManager.get().isSomethingEnabled()),但是由于某些原因,get返回了null。有人能解释一下这样的行为吗?也许map/reducer是作为单独的进程启动的?
发布于 2017-01-17 23:47:47
每个reduce任务运行在不同的jvm上。这就可以解释空值了。
您可以在以下位置对每个reduce任务执行此操作:Reducer - configure
https://stackoverflow.com/questions/41673176
复制相似问题