私はmapoの設定をキャッシュして検証するシングルトンを実装しようとしています。それはConfigurationManager
と名をつけましょう。ここでHadoopシングルトンパターン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;
}
}
あなたはスレッドセーフになるように設計されて見ることができるように。さらに、それは標準的なシングルトンではありません:私は、get
呼び出しでhadoopのConfiguration
インスタンスの存在を強制しないように初期化メソッドとアクセサメソッドを分離しました。だから私は早くTool
のinit
と呼んでから、get
(このようなConfigurationManager.get().isSomethingEnabled()
のような)を使って私のシングルトンにアクセスしようとしましたが、何らかの理由でnull
が返されます。誰か、そのようなふるまいを説明してもらえますか? map/reducersは別のプロセスとして開始されるのでしょうか?
:タスクを減らすごとに
あなたはそれを行うことができます。あなたの質問にハープープが関係するのはなぜですか? – shmosel
@shmosel、不正確で申し訳ありません。一定。 Hadoopは私の質問に関連しています。なぜなら、このコードは独立した環境で動作しているからです(これをテストした)。私が記述した条件でそれを置くとすぐに私は働いていません。 –
私はあなたを正しく理解していれば、あなたは 'get()'を呼び出す前に 'get(Configuration)'と呼んでいて、nullがあることに驚いています。どのようにイニシャライザが最初に実行されるのを確認しましたか? – shmosel