Настройка параметра в конфигурации задания MapReduce
Есть ли способ установить параметр в конфигурации задания из Mapper
и доступен из Reducer
,
Я попробовал приведенный ниже код
В Mapper: map(..)
: context.getConfiguration().set("Sum","100");
В редукторе: reduce(..)
: context.getConfiguration().get("Sum");
Но в редукторе значение возвращается как null
,
Есть ли способ реализовать это или что-то упущенное с моей стороны?
2 ответа
Насколько я знаю, это невозможно. Конфигурация задания сериализуется в XML во время выполнения с помощью Jobtracker и копируется во все узлы задачи. Любые изменения в объекте конфигурации будут влиять только на этот объект, который является локальным для конкретной задачи JVM; это не изменит XML на каждом узле.
В общем, вы должны стараться избегать любого "глобального" состояния. Это противоречит парадигме MapReduce и, как правило, предотвращает параллелизм. Если вам абсолютно необходимо передать информацию между этапами Map и Reduce, и вы не можете сделать это с помощью обычного шага перемешивания / сортировки, то вы можете попробовать выполнить запись в распределенный кэш или напрямую в HDFS.
Если вы используете новый API, ваш код в идеале должен работать. Вы создали это свойство "Сумма" в начале создания вакансии? Например, вот так
Configuration conf = new Configuration();
conf.set("Sum", "0");
Job job = new Job(conf);
Если не лучше использовать
context.getConfiguration().setIfUnset("Sum","100");
В вашем классе картографа, чтобы исправить проблему. Это единственное, что я вижу.