我正在尝试实现单例,该单例将缓存并验证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;
}
}
如您所见,它被设计为线程安全的。此外,它不是标准的单例:我分离了初始化和访问器方法,以不强制Configuration
在get
调用时出现hadoop实例。因此,要使用它,我会过早地调用init
的祖先,Tool
然后尝试在化简器中使用我的单例get
(像这样ConfigurationManager.get().isSomethingEnabled()
),但是由于某些原因会get
返回null
。有人可以解释这种行为吗?也许地图/缩小器是作为单独的过程启动的?
每个reduce任务都在不同的jvm上运行。这将解释为空。
您可以在以下的每个reduce任务中进行操作:Reducer-配置
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句