#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 на разные узлы.