복붙노트

[HADOOP] 맵의 예상 값에서 키의 하둡 유형 불일치 텍스트 수신 값 LongWritable

HADOOP

맵의 예상 값에서 키의 하둡 유형 불일치 텍스트 수신 값 LongWritable

누구나 왜이 오류가 발생하는지 알 수 있습니까? 나는 다른 비슷한 게시물을 많이 보았지만 그 중 대부분은 나에게 적용되지 않았다. 나는 나에게도 적용되는 몇 가지 해결책을 시도했지만 효과가 없었다. 나는 바보 같은 것을 놓친 것 같다. , 도와 주셔서 감사합니다

chris@chrisUHadoop:/usr/local/hadoop-1.0.3/build$ hadoop MaxTemperature 1901 output4
12/07/03 17:23:08 WARN mapred.JobClient: Use GenericOptionsParser for parsing the     arguments. Applications should implement Tool for the same.
12/07/03 17:23:08 INFO input.FileInputFormat: Total input paths to process : 1
12/07/03 17:23:08 INFO util.NativeCodeLoader: Loaded the native-hadoop library
12/07/03 17:23:08 WARN snappy.LoadSnappy: Snappy native library not loaded
12/07/03 17:23:09 INFO mapred.JobClient: Running job: job_201207031642_0005
12/07/03 17:23:10 INFO mapred.JobClient:  map 0% reduce 0%
12/07/03 17:23:28 INFO mapred.JobClient: Task Id : attempt_201207031642_0005_m_000000_0, Status : FAILED
java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org.apache.hadoop.io.LongWritable
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1014)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691)
at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
at org.apache.hadoop.mapreduce.Mapper.map(Mapper.java:124)
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:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.mapred.Child.main(Child.java:249)

프로그램:

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

private static final int MISSING = 9999;

@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
    String line = value.toString();
    String year = line.substring(15,19);
    int airTemperature;
    if (line.charAt(87) == '+')
    {
        airTemperature = Integer.parseInt(line.substring(88,92));
    }
    else
    {
        airTemperature = Integer.parseInt(line.substring(87,92));
    }
    String quality = line.substring(92,93);
    if (airTemperature != MISSING && quality.matches("[01459]"))
    {
        context.write(new Text(year), new IntWritable(airTemperature));
    }
}

}

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable>
{
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException
{
    int maxValue = Integer.MIN_VALUE;
    for (IntWritable value : values)
    {
        maxValue = Math.max(maxValue, value.get());
    }
    context.write(key, new IntWritable(maxValue));
}
}

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class MaxTemperature 
{

public static void main(String[] args) throws Exception 
{
    if (args.length != 2)
    {
        System.out.println("Usage: MaxTemperature <input path> <output path>");
        System.exit(-1);
    }

    Job job = new Job();
    job.setJarByClass(MaxTemperature.class);
    job.setJobName("Max temperature");

    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

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

    System.exit(job.waitForCompletion(true) ? 0 : 1);

}
}

해결법

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

    1.많은 구성 속성이 누락 된 것 같습니다.

    많은 구성 속성이 누락 된 것 같습니다.

    ID 매퍼가 전달 된 것과 동일한 키 / 값 유형을 출력하기 때문에 특정 오류 메시지가 표시됩니다.이 경우 입력 유형을 정의하지 않았으므로 LongWritable 유형의 값과 키 유형이 기본값입니다. 아마 TextInputFormat). 구성에서 출력 키 유형을 텍스트로 정의했지만 맵퍼가 LongWritable을 출력하므로 오류 메시지가 표시됩니다.

  2. ==============================

    2.job.xml에서 다음 등록 정보를 설정해야합니다.

    job.xml에서 다음 등록 정보를 설정해야합니다.

    <property>
    <name>mapred.input.format.class</name>
    <value>org.apache.hadoop.mapred.TextInputFormat</value>
    <description>The full class name of the InputFormat class to be used for obtaining the input to the mapper.</description>
    </property>
    
  3. from https://stackoverflow.com/questions/11319727/hadoop-type-mismatch-in-key-from-map-expected-value-text-received-value-longwrit by cc-by-sa and MIT license