Вызов задания hadoop из кода Java без фляги - PullRequest
1 голос
/ 02 апреля 2012

Я использовал этот код для запуска задания счетчика слов hadoop. WordCountDriver запускается, когда я запускаю его из затмения с помощью плагина hadoop eclipse. WordCountDriver также запускается из командной строки, когда я упаковываю классы маппера и редуктора в jar-файл и помещаю его в путь к классам.

Однако произойдет сбой, если я попытаюсь запустить его из командной строки, не добавляя класс преобразователя и редуктора в качестве jar в путь к классам, хотя я добавил оба класса в путь к классам. Я хотел бы знать, есть ли какое-то ограничение в Hadoop от принятия классов Mapper и Reducer в качестве обычных файлов классов. Всегда ли создание банки обязательно?

public class WordCountDriver extends Configured implements Tool {</p> <pre><code>public static final String HADOOP_ROOT_DIR = "hdfs://universe:54310/app/hadoop/tmp"; static class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private Text word = new Text(); private final IntWritable one = new IntWritable(1); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer itr = new StringTokenizer(line.toLowerCase()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } }; static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable value : values) { sum += value.get(); // process value } context.write(key, new IntWritable(sum)); } }; /** * */ public int run(String[] args) throws Exception { Configuration conf = getConf(); conf.set("mapred.job.tracker", "universe:54311"); Job job = new Job(conf, "Word Count"); // specify output types job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // specify input and output dirs FileInputFormat.addInputPath(job, new Path(HADOOP_ROOT_DIR + "/input")); FileOutputFormat.setOutputPath(job, new Path(HADOOP_ROOT_DIR + "/output")); // specify a mapper job.setMapperClass(WordCountDriver.WordCountMapper.class); // specify a reducer job.setReducerClass(WordCountDriver.WordCountReducer.class); job.setCombinerClass(WordCountDriver.WordCountReducer.class); job.setJarByClass(WordCountDriver.WordCountMapper.class); return job.waitForCompletion(true) ? 0 : 1; } /** * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { int res = ToolRunner.run(new Configuration(), new WordCountDriver(), args); System.exit(res); }

}

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Добавление классов в classpath hadoop сделает их доступными на стороне клиента (т. Е. Для вашего драйвера).

Ваш маппер и редуктор должны быть доступны для всего кластера, и чтобы упростить это в hadoop, вы объединяете их в jar и либо предоставляете класс Job.setJarByClass (..), либо добавляете ихв путь к классу задания, используя опцию -libjars с GenericOptionsParser:

1 голос
/ 02 апреля 2012

Не совсем понятно, на какой путь к классу вы ссылаетесь, но, в конце концов, если вы работаете на удаленном кластере Hadoop, вам нужно предоставить все классы в отправляемом файле JARHadoop во время исполнения hadoop jar.Путь к классам вашей локальной программы не имеет значения.

Вероятно, он работает локально, поскольку вы фактически запускаете экземпляр Hadoop внутри локального процесса.Таким образом, в этом случае он может найти классы в пути к классам вашей локальной программы.

...