복붙노트

[HADOOP] 맵에서 값의 유형이 일치하지 않습니다. 예상 org.apache.hadoop.io.NullWritable, 수신 된 org.apache.hadoop.io.Text

HADOOP

맵에서 값의 유형이 일치하지 않습니다. 예상 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)

해결법

  1. ==============================

    1.맵 출력 유형을 지정하지 않았으므로 맵퍼에 대해 잘못된 Text 및 NullWritable 인 감속기에 대해 설정 한 것과 동일한 결과를 얻습니다. 혼동을 피하기 위해 다음을 수행하여 맵퍼와 감속기 모두에 대해 모든 유형을 지정하는 것이 더 좋습니다.

    맵 출력 유형을 지정하지 않았으므로 맵퍼에 대해 잘못된 Text 및 NullWritable 인 감속기에 대해 설정 한 것과 동일한 결과를 얻습니다. 혼동을 피하기 위해 다음을 수행하여 맵퍼와 감속기 모두에 대해 모든 유형을 지정하는 것이 더 좋습니다.

    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(Text.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(NullWritable.class);
    
  2. from https://stackoverflow.com/questions/16926783/type-mismatch-in-value-from-map-expected-org-apache-hadoop-io-nullwritable-rec by cc-by-sa and MIT license