2013-06-04 5 views
13

私は私のニーズに合わせて、既存の問題を微調整しようとしています。..基本的に型の不一致:予想org.apache.hadoop.io.NullWritable、受け取っorg.apache.hadoop.io.Text

入力が..単純なテキスト 私はそれを処理し、 をリデューサーするキー/値ペアを渡すと、私はJSONを作成しているので、そこの鍵であるが、無価値 だから、マッパー:

入力:テキスト/テキスト

出力:テキスト/テキスト

リデューサー:テキスト/テキスト

出力:テキスト/なし

次のように私の署名は以下のとおりです。

public class AdvanceCounter { 
/** 
* The map class of WordCount. 
*/ 
public static class TokenCounterMapper 
    extends Mapper<Object, Text, Text, Text> { // <--- See this signature 

    public void map(Object key, Text value, Context context) // <--- See this signature 
     throws IOException, InterruptedException { 

    context.write(key,value); //both are of type text OUTPUT TO REDUCER 
    } 
} 
    public static class TokenCounterReducer 
    extends Reducer<Text, Text, Text, **NullWritable**> { // <--- See this signature Nullwritable here 
    public void reduce(Text key, Iterable<Text> values, Context context) // <--- See this signature 
     throws IOException, InterruptedException { 


     for (Text value : values) { 
      JSONObject jsn = new JSONObject(); 
      //String output = ""; 
      String[] vals = value.toString().split("\t"); 
      String[] targetNodes = vals[0].toString().split(",",-1); 
      try { 
       jsn.put("source",vals[1]); 
       jsn.put("targets",targetNodes); 
       context.write(new Text(jsn.toString()),null); // no value 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 


    } 
} 
public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
    Job job = new Job(conf, "Example Hadoop 0.20.1 WordCount"); 

    // ... 
    // 
    job.setOutputValueClass(NullWritable.class); 
    FileInputFormat.addInputPath(job, new Path(otherArgs[0])); 
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); 
    System.exit(job.waitForCompletion(true) ? 0 : 1); 
} 

} 

しかし、実行時に、私はこのエラーを取得しています:

13/06/04 13:08:26 INFO mapred.JobClient: Task Id : attempt_201305241622_0053_m_000008_0, Status : FAILED 
java.io.IOException: Type mismatch in value from map: expected org.apache.hadoop.io.NullWritable, recieved org.apache.hadoop.io.Text 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1019) 
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691) 
    at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80) 
    at org.sogou.Stinger$TokenCounterMapper.map(Stinger.java:72) 
    at org.sogou.Stinger$TokenCounterMapper.map(Stinger.java:1) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 

答えて

38

あなたの避難所あなたの地図出力タイプを指定していないので、あなたの減速機に設定したものと同じですが、TextNullWritableはあなたのマッパーにとって間違っています。

job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(Text.class); 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(NullWritable.class); 
+0

どうもありがとう:) – Fraz

+0

これは完璧に動作します:あなたはどんなことがマッパーと減速の両方のためにすべてのあなたのタイプを指定する方が良いでしょう混乱を避けるために、次のことを行う必要があります。 –

関連する問題