Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行简单的MapReduce程序时获取java.lang.ClassCastException:class java.lang.String_Java_Hadoop_Mapreduce_Classcastexception - Fatal编程技术网

在运行简单的MapReduce程序时获取java.lang.ClassCastException:class java.lang.String

在运行简单的MapReduce程序时获取java.lang.ClassCastException:class java.lang.String,java,hadoop,mapreduce,classcastexception,Java,Hadoop,Mapreduce,Classcastexception,我试图执行一个简单的MapReduce程序,其中Map接受输入,将其分成两部分(key=>String和value=>Integer) 减缩器汇总对应键的值 每次我都会有ClassCastException。 我无法理解,代码中的什么导致了这个错误 我的代码: import java.io.IOException; import java.util.Iterator; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.L

我试图执行一个简单的MapReduce程序,其中Map接受输入,将其分成两部分(key=>String和value=>Integer) 减缩器汇总对应键的值 每次我都会有ClassCastException。 我无法理解,代码中的什么导致了这个错误

我的代码:

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;

public class Test {
public static class Map extends MapReduceBase implements
        Mapper<LongWritable, Text, String, Integer> {

    @Override
    public void map(LongWritable key, Text value,
            OutputCollector<String, Integer> output, Reporter reporter)
            throws IOException {
        String line = value.toString();
        String[] lineParts = line.split(",");
        output.collect(lineParts[0], Integer.parseInt(lineParts[1]));

    }
}

public static class Reduce extends MapReduceBase implements
        Reducer<String, Integer, String, Integer> {

    @Override
    public void reduce(String key, Iterator<Integer> values,
            OutputCollector<String, Integer> output, Reporter reporter)
            throws IOException {
        int sum = 0;
        while (values.hasNext()) {
            sum = sum + values.next();
        }
        output.collect(key, sum);
    }
}

public static void main(String[] args) throws Exception {

    JobConf conf = new JobConf(Test.class);
    conf.setJobName("ProductCount");

    conf.setMapOutputKeyClass(String.class);
    conf.setMapOutputValueClass(Integer.class);

    conf.setOutputKeyClass(String.class);
    conf.setOutputValueClass(Integer.class);

    conf.setMapperClass(Map.class);
    conf.setReducerClass(Reduce.class);

    conf.setInputFormat(TextInputFormat.class);
    conf.setOutputFormat(TextOutputFormat.class);

    FileInputFormat.setInputPaths(conf, new Path(args[0]));
    FileOutputFormat.setOutputPath(conf, new Path(args[1]));

    JobClient.runJob(conf);

}
}
下面是堆栈跟踪。这和我的键值有关吗

14/02/11 23:57:35 INFO mapred.JobClient: Task Id : attempt_201402110240_0013_m_000001_2, Status : FAILED
java.lang.ClassCastException: class java.lang.String
at java.lang.Class.asSubclass(Class.java:3018)
at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:795)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:816)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:382)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:324)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
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:1115)
at org.apache.hadoop.mapred.Child.main(Child.java:262)


Exception in thread "main" java.io.IOException: Job failed!
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1246)
at Test.main(Test.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:186)
14/02/11 23:57:35信息映射。作业客户端:任务Id:尝试\u 201402110240\u 0013\u m\u000001\u 2,状态:失败
java.lang.ClassCastException:类java.lang.String
在java.lang.Class.asSubclass(Class.java:3018)中
位于org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:795)
位于org.apache.hadoop.mapred.MapTask$MapOutputBuffer。(MapTask.java:816)
位于org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:382)
位于org.apache.hadoop.mapred.MapTask.run(MapTask.java:324)
位于org.apache.hadoop.mapred.Child$4.run(Child.java:268)
位于java.security.AccessController.doPrivileged(本机方法)
位于javax.security.auth.Subject.doAs(Subject.java:396)
位于org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1115)
位于org.apache.hadoop.mapred.Child.main(Child.java:262)
线程“main”java.io.IOException中出现异常:作业失败!
位于org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1246)
at Test.main(Test.java:69)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.apache.hadoop.util.RunJar.main(RunJar.java:186)

在我看来,您似乎没有为输出使用正确的类

从其中一个MapReduce:

键和值类必须由框架序列化,因此需要实现可写接口。此外,关键类必须实现WritableComparable接口,以便于按照框架进行排序

因此,您应该将
String.class
替换为
Text.class
,将
Integer.class
替换为
IntWritable.class

我希望这能解决你的问题

为什么不能使用基本字符串或整数类?

Integer和String实现了Java的标准可序列化接口,如中所示。问题是MapReduce序列化/反序列化值时没有使用此标准接口,而是使用自己的接口,该接口被调用

那么他们为什么不直接使用基本的Java接口呢?

简单回答:因为它更有效。可写接口在序列化时忽略类型定义,因为您已经在MapReduce代码中定义了输入/输出的类型。因为您的代码已经知道接下来会发生什么,所以不要像这样序列化字符串:

String: "theStringItself"
它可以序列化为:

theStringItself
如您所见,这节省了大量内存


详细回答:阅读这篇文章非常棒。

我建议您使用org.apache.hadoop.mapreduce包而不是mapred,mapred有点过时(请参见:),但我认为这不会解决问题,它更可能是最佳实践。您是否可以用IntWritable替换整数和字符串类,Text?@TomSebastian我按照建议替换了这些类,现在可以使用了。你能解释一下为什么它不能处理字符串和整数吗。我应该避免使用字符串和整数类作为编写MapReduce程序的键/值吗?是否有一些选择键/值类的规则?@Matthias非常感谢您提供的信息。我将在将来处理它。我编辑了我的帖子,为您提供了关于使用字符串和整数的更多细节。我希望你喜欢:)
theStringItself