Зачем объявлять классы Mapper и Reducer статическими?

Это, вероятно, свидетельствует о том, что я не понимаю Java, но мне интересно, почему в большинстве программ MapReduce классы картографа и редуктора объявлены как статические?


person kee    schedule 19.07.2012    source источник


Ответы (2)


При объявлении классов преобразователя и редуктора в качестве внутренних классов для другого класса они должны быть объявлены статическими, чтобы они не зависели от родительского класса.

Hadoop использует отражение для создания экземпляра класса для каждой выполняемой карты или задачи сокращения. Новый созданный экземпляр ожидает конструктор с нулевым аргументом (иначе как бы он узнал, что передать).

Объявив внутренний преобразователь или класс сокращения без ключевого слова static, компиляция java фактически создает конструктор, который ожидает, что экземпляр родительского класса будет передан при построении.

Вы должны увидеть это, запустив команду javap для сгенерированного файла класса.

Кроме того, статическое ключевое слово недействительно при использовании в объявлении родительского класса (поэтому вы никогда не видите его на верхнем уровне, а только в дочерних классах).

person Chris White    schedule 20.07.2012
comment
Спасибо. На самом деле ваше объяснение об отражении решило другую проблему, с которой я столкнулся. - person kee; 20.07.2012
comment
@Chris White Ты гений. - person Anil Kumar; 16.11.2016

Я могу думать о двух причинах:

  1. При выполнении методов уменьшения карты не требуется никакого состояния, которое должно быть сохранено в объекте. Таким образом вся необходимая информация передается в метод, нет необходимости хранить дополнительные данные в объекте. Если время жизни объекта не превысит одного вызова метода, зачем тогда мучиться с инстанцированием?
  2. Не имеет смысла иметь более одного объекта, по тем же причинам, по которым вы бы реализовали Singleton Pattern< /а>.
person Konrad Reiche    schedule 19.07.2012
comment
Это неправильно — в map-reduce создается несколько конкретных экземпляров класса Mapper; и они действительно могут сохранять состояние. Я предполагаю, что значение статического в Java отличается от, например. С#. - person Janik Zikovsky; 05.02.2014