Как передать объект в Mapper и редукторы

#java #hadoop

#java #hadoop

Вопрос:

У меня есть приложение, запущенное на hadoop. Как я могу передать объекты в mappers и reducers для обработки данных. Например, я объявляю объект FieldFilter для фильтрации строк, обработанных в Mappers. Фильтры содержат множество правил фильтрации, которые задаются пользователями. Итак, мне интересно, как я могу передать фильтры и правила картографам и редукторам? Моя идея состоит в том, чтобы сериализовать объекты в строку, передать строку с помощью 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;
}    }
 

Комментарии:

1. Вы не приняли никакого ответа на свои вопросы.

2. «не принял никакого ответа»?? Я задаю вопрос здесь. почему вы сказали, что я не принял ни одного вопроса. Два странных ответа!!

Ответ №1:

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

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

Ответ №2:

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

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

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