Распространение пользовательских значений конфигурации в Hadoop
Есть ли способ установить и (позже) получить пользовательский объект конфигурации в Hadoop во время Map/Reduce?
Например, предположим, что приложение предварительно обрабатывает большой файл и динамически определяет некоторые характеристики, связанные с файлом. Кроме того, предположим, что эти характеристики сохранены в пользовательском объекте Java (например, Properties
объект, но не исключительно, поскольку некоторые из них могут не быть строками) и впоследствии необходимы для каждой из карт и задач сокращения.
Как приложение может "распространять" эту конфигурацию, чтобы каждая функция отображения и преобразования могла получить к ней доступ, когда это необходимо?
Одним из подходов может быть использование set(String, String)
метод JobConf
класс и, например, передать объект конфигурации, сериализованный как JSON
строка через второй параметр, но это может быть слишком много взлома, а затем соответствующий JobConf
экземпляр должен быть доступен каждому Mapper
а также Reducer
в любом случае (например, следуя подходу, подобному предложенному в предыдущем вопросе).
1 ответ
Если я что-то упустил, если у вас есть Properties
объект, содержащий все свойства, которые вам нужны в вашей работе M/R, вам просто нужно написать содержание Properties
возражать против Hadoop Configuration
объект. Например, что-то вроде этого:
Configuration conf = new Configuration();
Properties params = getParameters(); // do whatever you need here to create your object
for (Entry<Object, Object> entry : params.entrySet()) {
String propName = (String)entry.getKey();
String propValue = (String)entry.getValue();
conf.set(propName, propValue);
}
Тогда внутри вашей работы M/R, вы можете использовать Context
объект, чтобы вернуть свой Configuration
в обоих картографических (map
функция) или редуктор (reduce
функция), вот так:
public void map(MD5Hash key, OverlapDataWritable value, Context context)
Configuration conf = context.getConfiguration();
String someProperty = conf.get("something");
....
}
Обратите внимание, что при использовании Configuration
объект, вы также можете получить доступ к Context
в setup
а также cleanup
методы, полезные для инициализации, если это необходимо.
Также стоит упомянуть, что вы, вероятно, можете позвонить напрямую addResource
метод из Configuration
объект, чтобы добавить свои свойства непосредственно как InputStream
или файл, но я считаю, что это должна быть конфигурация XML, подобная обычным конфигам Hadoop XML, так что это может быть просто излишним.
РЕДАКТИРОВАТЬ: В случае не-String объектов, я бы посоветовал использовать сериализацию: вы можете сериализовать ваши объекты, а затем преобразовать их в строки (вероятно, кодировать их, например, с помощью Base64, так как я не уверен, что произойдет, если у вас есть необычные символы), а затем на стороне маппера / редуктора десериализовать объекты из строк, которые вы получаете из свойств внутри Configuration
,
Другой подход заключается в том, чтобы сделать ту же технику сериализации, но вместо этого записать в HDFS, а затем добавить эти файлы в DistributedCache
, Звучит немного излишне, но это, вероятно, сработает.