2015-12-17 1 views
1

У меня есть работа по сокращению карты hasoop (2.2.0), которая читает текст по указанному пути (скажем, INPUT_PATH) и выполняет некоторую обработку. Я не хочу жестко кодировать входной путь (поскольку он исходит из какого-то другого источника, который меняется каждую неделю).Задайте свойства задания и переопределите свойства в заданиях hadoop.

Я считаю, что в hadoop должен быть способ указать файл свойств xml во время работы по командной строке. Как я должен это делать?

Один из способов, я думал, должен был установить переменную окружения, которая указывает на местоположение файла свойств, а затем прочитать эту переменную env в коде и впоследствии прочитать файл свойств. Это может работать, потому что значение переменной env может меняться каждую неделю без изменения кода. Но я считаю, что это уродливый способ загрузки свойств и переопределений.

Пожалуйста, дайте мне знать наименее хакерский способ сделать это.

ответ

1

Нет встроенного способа чтения любого файла конфигурации для ввода/вывода.

Один из способов я могу предложить реализовать программу драйвера Java M/R, который делает следующее,

  • Читать конфигурацию (XML/свойства/ничего) (Возможно генерироваться/обновляется другим процессом)
  • Установите свойство задания
  • Представить работу с помощью команды Hadoop (передать файл конфигурации в качестве аргумента)

Что-то вроде этого,

public class SampleMRDriver 
     extends Configured implements Tool { 

     @Override 
     public int run(
      String[] args) 
      throws Exception { 

      // Read from args the configuration file 
      Properties prop = new Properties(); 
      prop.loadFromXML(new FileInputStream(args[0])); 

      Job job = Job.getInstance(getConf(), "Test Job"); 

      job.setJarByClass(SampleMRDriver.class); 

      job.setOutputKeyClass(Text.class); 
      job.setOutputValueClass(Text.class); 

      job.setMapperClass(TestMapper.class); 
      job.setReducerClass(TestReducer.class); 

      FileInputFormat.setInputPaths(job, new Path(prop.get("input_path"))); 
      FileOutputFormat.setOutputPath(job, new Path(prop.get("output_path"))); 

      boolean success = job.waitForCompletion(true); 
      return success ? 0 : 1; 

     } 

     public static void main(
      String[] args) 
      throws Exception { 

      ToolRunner.run(new BatteryAnomalyDetection(), args); 
     } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^