2015-01-31 5 views
-1

Я новичок в MapReduce приложениях. Я просто пытаюсь найти длину слов в своем наборе данных и классифицировать их как крошечные, маленькие, медные, огромные по своей длине, и в конце концов, я хочу видеть общее количество, сколько слов крошечное, малое, среднее или огромный на моем наборе данных на Java, но у меня есть проблема с внедрением редуктора. Когда я выполняю файл jar на кластере Hadoop, он не возвращает никакого результата. Если кто-нибудь даст мне руку, я буду благодарен. Вот код редуктора, который я пытаюсь выполнить, но у меня много ошибок, я думаю.Категорирование слов по их длине на редукторе

public class WordSizeReducer extends Reducer<IntWritable, IntWritable, Text, IntWritable> { 
    private IntVariable result = new IntVariable(); 
    IntWritable tin, smal, mediu,bi; 
    int t, s, m, b; 
    int count; 
    Text tiny, small, medium, big; 

    public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{ 

     for (IntWritable val:values){ 
      if(val.get() == 1){ 
       tin.set(t); 
       t++;        
       } 
      else if(2<=val.get() && val.get()<=4){ 
       smal.set(s); 
       s++;     
       } 
      else if(5<=val.get() && val.get()<=9){ 
       mediu.set(m); 
       m++;     
       } 
      else if(10<=val.get()){ 
       bi.set(b); 
       b++; } 

     }  
     context.write(tiny, tin); 
     context.write(small, smal); 
     context.write(medium, mediu); 
     context.write(big, bi); 
    } 
} 

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

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

ответ

0

tiny, small, medium и big никогда не инициализируется, поэтому они будут нуль.

Это означает, что все ваши вызовы context.write() используют нулевой ключ.

Очевидно, это нехорошо, так как вы не сможете отличить подсчеты от разных размеров слов.

Еще хуже, tin, smal, mediu, bi никогда не инициализируется, что приведет к NullPointerException сек при попытке вызвать set() на них (инициализируем result правильно, но никогда не использовать).

(Кроме того, вам не нужно устанавливать IntWritables повторно в течение вашего цикла по значениям, просто обновить t,s,m,b затем установите IntWritable s один раз в конце перед context.write() вызовов)

Update теперь, картографа код добавлен:

Для каждого слова на входе вы пишете пары ключ-значение (длина, 1).

Редуктор будет собирать все значения с тем же ключом, так что она будет называться, например:

(2, [1,1,1,1,1,1,1,1,]) 
(3, [1,1,1]) 

Так что ваш редуктор будет только когда-либо увидеть значение «1», что оно неправильно рассматривая как длину слова. На самом деле ключ - это длина слова.

Update теперь трассировки стека добавил:

Сообщение об ошибке объясняет, что это неправильно - Hadoop не может найти классы работу, поэтому они не выполняются вообще. Ошибка говорит:

java.lang.ClassNotFoundException: WordSize.WordsizeMapper 

но ваш класс называется WordSizeMapper (или, может быть WordSize.WordSizeMapper, если у вас есть внешний класс) - обратите внимание на различную капитализацию «размер»/«Размер»! Вам нужно проверить, как вы вызываете Hadoop.

+0

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

+0

Каждый из «крошечных», «малых», «средних» и «больших» должен быть установлен на другой текст, например. 'Text tiny = new Text (" tiny ");' (Также лучше избегать обновления кода в вашем вопросе, так что ответы все еще имеют смысл, когда люди читают их позже!) – DNA

+0

Возможно, вы также захотите добавить некоторые записи, что вы можете видеть, что происходит. – DNA

0

Ни в коем случае, я также не проверял свой код, я сделал некоторые исправления, но результат тот же, в окне терминала hadoop, я не могу получить никакого результата. Последняя версия кода ниже:

public class WordSizeTest { 
    public static void main(String[] args) throws Exception{ 
     if(args.length != 2) 
     { 
      System.err.println("Usage: Word Size <in> <out>"); 
      System.exit(2); 
     } 
     Job job = new Job();  
     job.setJarByClass(WordSizeTest.class); 
     job.setJobName("Word Size"); 
     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 
     job.setMapperClass(WordSizeMapper.class); 
     job.setReducerClass(WordSizeReducer.class); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(IntWritable.class); 
     System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 
} 
public class WordSizeMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable> { 
    final static IntWritable one = new IntWritable(1); 
    IntWritable wordLength = new IntWritable(); 
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException 
    { 
     String line = value.toString(); 
     StringTokenizer tokenizer = new StringTokenizer(line); 
     while (tokenizer.hasMoreTokens()) { 
      wordLength.set(tokenizer.nextToken().length()); 
      context.write(wordLength, one);  
    } 
    } 
} 
public class WordSizeReducer extends Reducer<IntWritable, IntWritable, Text, IntWritable>{ 
    IntWritable tin = new IntWritable(); 
    IntWritable smal = new IntWritable(); 
    IntWritable mediu = new IntWritable(); 
    IntWritable bi = new IntWritable(); 
    int t, s, m, b; 
    Text tiny = new Text("tiny"); 
    Text small = new Text("small"); 
    Text medium = new Text("medium"); 
    Text big = new Text("big"); 
    public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{   
     for (IntWritable val:values){ 
      if(key.get() == 1){ 
       t += val.get();       
       } 
      else if(2<=key.get() && key.get()<=4){ 
       s += val.get();    
       } 
      else if(5<=key.get() && key.get()<=9){ 
       m += val.get();    
       } 
      else if(10<=key.get()){ 
       b += val.get();    
       } 

     } 
     tin.set(t); 
     smal.set(s); 
     mediu.set(m); 
     bi.set(b); 
     context.write(tiny, tin); 
     context.write(small, smal); 
     context.write(medium, mediu); 
     context.write(big, bi); 
    } 
    } 

Ошибка на терминале как то,

15/02/01 12:09:25 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 
15/02/01 12:09:25 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String). 
15/02/01 12:09:25 INFO input.FileInputFormat: Total input paths to process : 925 
15/02/01 12:09:25 WARN snappy.LoadSnappy: Snappy native library is available 
15/02/01 12:09:25 INFO util.NativeCodeLoader: Loaded the native-hadoop library 
15/02/01 12:09:25 INFO snappy.LoadSnappy: Snappy native library loaded 
15/02/01 12:09:29 INFO mapred.JobClient: Running job: job_201501191143_0177 
15/02/01 12:09:30 INFO mapred.JobClient: map 0% reduce 0% 
15/02/01 12:09:47 INFO mapred.JobClient: Task Id : attempt_201501191143_0177_m_000001_0, Status : FAILED 
java.lang.RuntimeException: java.lang.ClassNotFoundException: WordSize.WordSizeMapper 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:859) 
    at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:718) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:369) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    at java.security.AccessController.doPrivileged(AccessController.java:310) 
    at javax.security.auth.Subject.doAs(Subject.java:573) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 
Caused by: java.lang.ClassNotFoundException: WordSize.WordsizeMapper 
    at java.lang.Class.forName(Class.java:174) 
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:812) 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:857) 
    ... 8 more 
15/02/01 12:09:49 INFO mapred.JobClient: Task Id : attempt_201501191143_0177_m_000000_0, Status : FAILED 
Смежные вопросы