Это, вероятно, свидетельствует о том, что я не понимаю Java, но мне интересно, почему в большинстве программ MapReduce классы картографа и редуктора объявлены как статические?
Зачем объявлять классы Mapper и Reducer статическими?
Ответы (2)
При объявлении классов преобразователя и редуктора в качестве внутренних классов для другого класса они должны быть объявлены статическими, чтобы они не зависели от родительского класса.
Hadoop использует отражение для создания экземпляра класса для каждой выполняемой карты или задачи сокращения. Новый созданный экземпляр ожидает конструктор с нулевым аргументом (иначе как бы он узнал, что передать).
Объявив внутренний преобразователь или класс сокращения без ключевого слова static, компиляция java фактически создает конструктор, который ожидает, что экземпляр родительского класса будет передан при построении.
Вы должны увидеть это, запустив команду javap для сгенерированного файла класса.
Кроме того, статическое ключевое слово недействительно при использовании в объявлении родительского класса (поэтому вы никогда не видите его на верхнем уровне, а только в дочерних классах).
Я могу думать о двух причинах:
- При выполнении методов уменьшения карты не требуется никакого состояния, которое должно быть сохранено в объекте. Таким образом вся необходимая информация передается в метод, нет необходимости хранить дополнительные данные в объекте. Если время жизни объекта не превысит одного вызова метода, зачем тогда мучиться с инстанцированием?
- Не имеет смысла иметь более одного объекта, по тем же причинам, по которым вы бы реализовали Singleton Pattern< /а>.