2012-07-18 38 views
1

我試圖用一些簡單的代碼使用Map reduce框架來咳嗽。以前我已經使用mapred包實現,並且能夠將輸入格式類指定爲KeyvalueTextInputFormat但是在使用mapreduce的新Api中,此類不存在。我嘗試使用TextInputFormat.class但我仍然得到以下異常Hadoop新API的類演員例外

- job_local_0001 
java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text 
    at com.hp.hpl.mapReduceprocessing.MapReduceWrapper$HitFileProccesorMapper_internal.map(MapReduceWrapper.java:1) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:621) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:177) 

這裏是代碼的示例代碼段

Configuration conf = new Configuration(); 
     conf.set("key.value.separator.output.line", ",");  

     Job job = new Job(conf, "Result Aggregation"); 
     job.setJarByClass(ProcessInputFile.class); 

     job.setInputFormatClass(TextInputFormat.class); 
     job.setOutputFormatClass(TextOutputFormat.class); 

     job.setMapOutputKeyClass(Text.class); 
     job.setMapOutputValueClass(Text.class); 

     job.setMapperClass(MultithreadedMapper.class); 
     MultithreadedMapper.setMapperClass(job, HitFileProccesorMapper_internal.class); 
     MultithreadedMapper.setNumberOfThreads(job, 3); 
     //job.setMapperClass(HitFileProccesorMapper_internal.class); 
     job.setReducerClass(HitFileReducer_internal.class); 

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



     FileInputFormat.addInputPath(job, new Path(inputFileofhits.getName())); 
     FileOutputFormat.setOutputPath(job, new Path(ProcessInputFile.resultAggProps 
       .getProperty("OUTPUT_DIRECTORY"))); 

     try { 
      job.waitForCompletion(true); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

請不要讓我知道什麼是做出這樣的配置更改該classcast異常可以避免。

回答

1

這種情況通常發生在MapReduce試圖通過鍵/值的類型不匹配以及Map或Reduce類被模板化爲什麼時。

你說你使用KeyvalueTextInputFormat,但在你的代碼中你使用的是TextInputFormatTextInputFormat傳遞記錄爲<LongWritable, Text>:「位置,行」。

我會猜測你的Mapper的類型是<Text, Text, ?, ?>。因此,MapReduce正在試圖將LongWritable轉換爲TextInputFormat將其提供給Text,並且它不能,因此它會彈出。

我建議你要麼KeyvalueTextInputFormat要麼改變你的mapper的類型爲<LongWritable, Text, ?, ?>

+0

嗨,Thaks的答覆..但我已經提到,我曾經使用過KeyValueTextInputFormat ..這個類不存在於我現在使用的新版本的hadoop ..我現在修改我的Mapper到Longwritable ..但我仍然好奇如何避免類拋出異常..在此先感謝 – 2012-07-19 16:36:16

+0

你是什麼意思,你仍然好奇如何避免它?爲了避免這種情況,您需要確保映射器中的模板類型與輸入格式相匹配。 – 2012-07-19 20:03:39