В настоящее время каково поведение метода run(Context) по умолчанию.
Реализация по умолчанию видна в исходном коде Apache Hadoop для Mapper:
/**
* Expert users can override this method for more complete control over the
* execution of the Mapper.
* @param context
* @throws IOException
*/
public void run(Context context) throws IOException, InterruptedException {
setup(context);
try {
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
} finally {
cleanup(context);
}
}
Обобщить:
Вызовите setup для однократной инициализации.
Перебрать все пары ключ-значение во входных данных.
Передайте ключ и значение реализации метода map.
Позвоните cleanup для разового демонтажа.
Если я переопределю run(Context), какой специальный элемент управления будет получен в соответствии с документацией?
Реализация по умолчанию всегда следует определенной последовательности выполнения в одном потоке. Переопределение этого было бы редкостью, но это могло бы открыть возможности для узкоспециализированных реализаций, таких как различные модели многопоточности или попытки объединить избыточные диапазоны ключей.
Кто-нибудь переопределил этот метод в ваших реализациях?
В кодовой базе Apache Hadoop есть два переопределения этого:
ChainMapper позволяет объединение нескольких реализаций класса Mapper для выполнения в рамках одной задачи карты. Переопределение run устанавливает объект, представляющий цепочку, и передает каждую входную пару ключ/значение через эту цепочку преобразователей.
MultithreadedMapper позволяет многопоточное выполнение другого класса Mapper. Этот класс Mapper должен быть потокобезопасным. Переопределение run запускает несколько потоков, итерирующих входные пары ключ-значение и пропускающих их через базовый Mapper.