2013-06-04 15 views
13

मैं अपने आवश्यकताओं के अनुरूप एक मौजूदा समस्या tweak कोशिश कर रहा हूँ ..प्रकार बेमेल: उम्मीद 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

आपने अपने मानचित्र आउटपुट प्रकारों को निर्दिष्ट नहीं किया है, इसलिए यह आपके रेड्यूसर के लिए सेट जैसा ही है, जो Text और NullWritable हैं जो आपके मैपर के लिए गलत है । आप किसी भी भ्रामक यह दोनों नक्शाकार और कम करने के लिए अपने सभी प्रकार निर्दिष्ट करने के लिए बेहतर है से बचने के लिए निम्नलिखित करना चाहिए:

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

धन्यवाद एक बहुत :) – Fraz

+0

यह पूरी तरह से काम करता है। –

संबंधित मुद्दे