2015-06-30 2 views
2

У меня возникает проблема с искровыми и статическими переменными. У меня есть класс конфигурации с некоторыми статическими переменными, которые я инициализирую из файла свойств во время выполнения.Статическая переменная внутри искровой работы -Java

 System.out.println("Outside : "+ActiveMQConfig.HOST_ADDRESS); 
     rePartition.foreachRDD(new Function<JavaRDD<String>, Void>() { 
      public Void call (JavaRDD<String> rdd) throws Exception 
      { 
       rdd.map(new Function<String, String>() { 
        public String call (String line) throws Exception 
        { 
         System.out.println("Inside :" + ActiveMQConfig.HOST_ADDRESS); 
         return null; 
        } 
       }).count(); 
       return null; 
      } 
     }); 
     ssc.remember(new Duration(1 * 60 * 1000)); 
     ssc.start(); 

Значение по умолчанию для ActiveMQConfig.HOST_ADDRESS является localhost и я устанавливаю некоторые IP из файла свойств во время выполнения.

Первая система выходит из печати ip Outside : ip, но система внутри метода карты отображает значение по умолчанию Inside :localhost. Что я здесь делаю неправильно? мне нужно транслировать все переменные, которые я хочу использовать внутри искры? Может ли кто-нибудь указать мне правильное направление?

Спасибо!

+0

Вероятно, не так полезный ответ: можно ли избежать «статический» в вашем коде? Очень часто люди думают, что введение глобального состояния через статику - хорошая идея; но очень часто ... это не требуется; и вызывает проблемы в долгосрочной перспективе. – GhostCat

+0

@ Jägermeister Извините, я не могу сделать конфигурационную переменную нестационарной переменной, поскольку я инициализирую эти переменные один раз и использую в разных частях приложения. –

+1

передают файл свойств с опцией -files с использованием spark-submit? – urug

ответ

1

Это связано с инициализацией объекта в JVM. Каждый рабочий загружает и инициализирует класс, содержащий статическую переменную, но, вероятно, (не показано) только драйвер инициализирует значение такой переменной на виртуальной машине драйвера.

В результате драйвер имеет обновленное значение, но каждый исполнитель имеет значение по умолчанию.

Один из способов работы вокруг этого является предоставление значения в явном виде к закрытию:

rePartition.foreachRDD(new Function<JavaRDD<String>, Void>() { 
    String host = ActiveMQConfig.HOST_ADDRESS 
    ... 
      System.out.println("Inside :" + host) 
    ... 
} 
Смежные вопросы