2016-10-11 2 views
1

Я пытаюсь запустить mapreduce в java, но получаю эту ошибку.MapReduce java.lang.ArrayIndexOutOfBoundsException: 0

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
     at com.mapreduce.WordCount.run(WordCount.java:23) 
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
     at com.mapreduce.WordCount.main(WordCount.java:18) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

WordCount.java

package com.mapreduce; 

import java.io.IOException; 
import java.util.*; 

import org.apache.hadoop.conf.*; 
import org.apache.hadoop.fs.*; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapreduce.*; 
import org.apache.hadoop.mapreduce.lib.input.*; 
import org.apache.hadoop.mapreduce.lib.output.*; 
import org.apache.hadoop.util.*; 

public class WordCount extends Configured implements Tool { 

    public static void main(String args[]) throws Exception { 
     int res = ToolRunner.run(new WordCount(), args); 
     System.exit(res); 
    } 

    public int run(String[] args) throws Exception { 
     Path inputPath = new Path(args[0]); 
     Path outputPath = new Path(args[1]); 

     Configuration conf = getConf(); 
     Job job = new Job(conf, this.getClass().toString()); 

     FileInputFormat.setInputPaths(job, inputPath); 
     FileOutputFormat.setOutputPath(job, outputPath); 

     job.setJobName("WordCount"); 
     job.setJarByClass(WordCount.class); 
     job.setInputFormatClass(TextInputFormat.class); 
     job.setOutputFormatClass(TextOutputFormat.class); 
     job.setMapOutputKeyClass(Text.class); 
     job.setMapOutputValueClass(IntWritable.class); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(IntWritable.class); 

     job.setMapperClass(Map.class); 
     job.setCombinerClass(Reduce.class); 
     job.setReducerClass(Reduce.class); 

     return job.waitForCompletion(true) ? 0 : 1; 
    } 

    public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> { 
     private final static IntWritable one = new IntWritable(1); 
     private Text word = new Text(); 

     @Override 
     public void map(LongWritable key, Text value, 
         Mapper.Context context) throws IOException, InterruptedException { 
      String line = value.toString(); 
      StringTokenizer tokenizer = new StringTokenizer(line); 
      while (tokenizer.hasMoreTokens()) { 
       word.set(tokenizer.nextToken()); 
       context.write(word, one); 
      } 
     } 
    } 

    public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { 

     @Override 
     public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
      int sum = 0; 
      for (IntWritable value : values) { 
       sum += value.get(); 
      } 

      context.write(key, new IntWritable(sum)); 
     } 
    } 

} 

Я undarstand, что это означает, что нет элементов в массиве, но то, что мне нужно сделать, чтобы сделать его запустить? Я использую Maven для импорта всех необходимых библиотек. Я запускаю его в Windows. Код представляет собой пример из http://www.macalester.edu/~shoop/sc13/hadoop/html/hadoop/wc-detail.html

+0

ArrayIndexOutOfBoundsException предположим, что args [] пуст. – Orejano

+0

ArrayIndexOutOfBoundsException, да его довольно само объяснение. Вы не получаете ожидаемых аргументов. – eldo

+0

Я бы посоветовал сначала начать с Java-книги, а затем перейти к хауопу. Это будет проще, чем изучение Java через Hadoop. – vefthym

ответ

2

Вам нужно запустить программу с аргументами, соответствующих входным трактом и путем выхода, так что ваша команда запуска должна быть следующей форма:

java -cp <my-classpath-here> com.mapreduce.WordCount <input-path> <output-path> 
+0

Что делать, если я использую окна? –

+0

что я предлагаю в своем ответе не зависит от ОС, поэтому он будет работать и на ОС Windows, полагая, что вы правильно обеспечиваете путь к классам и допустимый путь ввода и вывода –

+0

Будет ли путь ввода и вывода в этом случае указывать на текстовый документ? –

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

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