Какова цель функции org.apache.hadoop.mapreduce.Mapper.run () в Hadoop? - PullRequest
8 голосов
/ 18 сентября 2011

Какова цель функции org.apache.hadoop.mapreduce.Mapper.run() в Hadoop?setup() вызывается до вызова map(), а clean() вызывается после map().Документация для run() гласит:

Опытные пользователи могут переопределить этот метод для более полного контроля над выполнением Mapper.

Я ищу практическую цельэтой функции.

Ответы [ 3 ]

10 голосов
/ 18 сентября 2011

Метод run() по умолчанию просто берет каждую пару ключ / значение, предоставленную контекстом, и вызывает метод map():

public void run(Context context) throws IOException, InterruptedException {
    setup(context);
    while (context.nextKeyValue()) {
       map(context.getCurrentKey(), context.getCurrentValue(), context);
    }
    cleanup(context);
}

Если вы хотите сделать больше ... вам нужно переопределить это. Например, MultithreadedMapper class

1 голос
/ 27 марта 2014

Я только что придумал довольно странный случай использования этого.

Иногда я обнаруживал, что мне нужен маппер, который потребляет все свои входные данные, прежде чем производить какие-либо выходные данные.Я делал это в прошлом, выполняя записи в моей функции очистки.Моя функция карты на самом деле не выводит никаких записей, она просто читает входные данные и сохраняет все, что потребуется в частных структурах.

Оказывается, что этот подход работает нормально, если вы не производите МНОГО выходных данных.Лучшее, что я могу разглядеть, это то, что средство разлива картографа не работает во время очистки.Таким образом, создаваемые записи просто накапливаются в памяти, и если их слишком много, вы рискуете исчерпать кучу.Это мое предположение о том, что происходит - может быть неправильно.Но определенно проблема исчезает с моим новым подходом.

Этот новый подход заключается в переопределении run () вместо cleanup ().Мое единственное изменение в функции run () по умолчанию состоит в том, что после того, как последняя запись была доставлена ​​в map (), я вызываю map () еще раз с нулевым ключом и значением.Это сигнал моей функции map (), чтобы он продолжил и выдал свой вывод.В этом случае, когда утилита по-прежнему работает, использование памяти остается под контролем.

0 голосов
/ 28 августа 2013

Возможно, это можно использовать и для отладки. Затем вы можете пропустить часть входных пар ключ-значение (= взять образец), чтобы проверить ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...