Зачем нам нужно явно указывать выходной ключ / класс значений в программе Hadoop? - PullRequest
5 голосов
/ 18 сентября 2011

В книге «Hadoop: полное руководство» приведен пример программы с приведенным ниже кодом.

JobConf conf = new JobConf(MaxTemperature.class);  
conf.setJobName("Max temperature");  
FileInputFormat.addInputPath(conf, new Path(args[0]));  
FileOutputFormat.setOutputPath(conf, new Path(args[1]));  
conf.setMapperClass(MaxTemperatureMapper.class);  
conf.setReducerClass(MaxTemperatureReducer.class);  
conf.setOutputKeyClass(Text.class);  
conf.setOutputValueClass(IntWritable.class);  

Инфраструктура MR должна уметь вычислять ключ вывода и класс значений из Mapper и функций Reduce, которые устанавливаются в классе JobConf. Почему нам нужно явно установить выходной ключ и класс значений в классе JobConf? Также нет аналогичного API для пары ключ / значение ввода.

1 Ответ

7 голосов
/ 18 сентября 2011

Причина - стирание типа [1]. Вы устанавливаете выходные классы K / V как обобщенные. Во время настройки задания (т.е. времени выполнения, а не времени компиляции) эти обобщенные элементы стираются.

Входные классы k / v могут быть прочитаны из входного файла, в случае SequenceFiles классы находятся в заголовке - вы можете прочитать их при открытии файла последовательности в редакторе. Этот заголовок должен быть написан, так как каждый вывод карты является SequenceFile, поэтому вам нужно предоставить классы.

[1] http://download.oracle.com/javase/tutorial/java/generics/erasure.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...