我正在尝试实现单例,它将缓存和验证 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上运行。这将解释空。
您可以在以下位置按归约任务执行此操作:减速器 - 配置