Как передать объект в Mapper и редукторы - PullRequest
4 голосов
/ 22 октября 2011

У меня есть приложение, запущенное на hadoop. Как я могу передать объекты в мапперы и редукторы для обработки данных. Например, я объявляю объект FieldFilter для фильтрации строк, обработанных в Mappers. Фильтры содержат много правил фильтрации, которые задаются пользователями. Итак, мне интересно, как я могу передать фильтры и правила Mappers и Reducers? Моя идея состоит в том, чтобы сериализовать объекты в String, передать строку с помощью configure, а затем заново построить объект по строке. Но, кажется, не очень хорошо для меня! какие-нибудь другие подходы? спасибо!

public class FieldFilter  {      
private final ArrayList<FieldFilterRule> rules = new ArrayList<FieldFilterRule>();

public FieldFilter addRule(FieldFilterRule ... rules) {
    for (int i = 0; i < rules.length; i++) {
        this.rules.add(rules[i]);
        rules[i].setFieldFilter(this);
    }
    return this;
}    }

Ответы [ 2 ]

4 голосов
/ 23 октября 2011

Вы хотите использовать setClass() в Configuration, как вы видите здесь .Вы можете затем создать экземпляр класса newInstance().Не забудьте создать экземпляр в методе setup() маппера / редуктора, чтобы не создавать экземпляр фильтра каждый раз, когда вызываются методы map / lower.Удачи.

- Правка.Я должен добавить, что у вас есть доступ к конфигурации через контекст, и именно так вы получите нужный вам класс.В настройках API есть метод getClass().

1 голос
/ 23 октября 2011

Serialize FieldFilter и поместите в HDFS, а затем прочитайте его в функциях картографирования / редуктора, используя HDFS API. Если у вас большой кластер, вам может потребоваться увеличить коэффициент репликации , который по умолчанию равен 3 для сериализованного класса FieldFilter, поскольку большее число задач отображения и чтения будет считывать сериализованный класс FieldFilter.

Если используется новый API MapReduce, то сериализованный файл FieldFilter можно прочитать в функции Mapper.setup () . Это вызывается во время инициализации задачи карты. Не удалось найти что-то похожее для старого API MapReduce.

Вы также можете рассмотреть возможность использования DistributedCache для распределения сериализованного класса FieldFilter по разным узлам.

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