java - hadoop程序中的类型不匹配错误

标签 java hadoop mapreduce

import java.io.IOException;
import java.util.*;
import org.apache.hadoop.conf.Configuration;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class CommonFriends {
        public static class TokenizerMapper
                extends Mapper<Object, Text, Text, IntWritable>{
                private IntWritable friend = new IntWritable();
                private Text friends = new Text();
                public void map(Object key, Text value, Context context )     throws IOException, InterruptedException {
                        StringTokenizer itr = new     StringTokenizer(value.toString(),"\n");
                    while (itr.hasMoreTokens()) {
                            String[] line = itr.nextToken().split(" ");
                            if(line.length > 2 ){
                                    int person = Integer.parseInt(line[0]);
                                    for(int i=1; i<line.length;i++){
                                            int ifriend = Integer.parseInt(line[i]);
                                            friends.set((person < ifriend ? person+"-"+ifriend : ifriend+"-"+person));
                                            for(int j=1; j< line.length; j++ ){
                                                    if( i != j ){
                                                            friend.set(Integer.parseInt(line[j]));
                                                            context.write(friends, friend);
                                                    }
                                            }
                                    }
                            }
                    }
            }
    }

    public static class IntSumReducer extends Reducer<Text,IntWritable,Text,Text> {
            private Text result = new Text();
            public void reduce(Text key, Iterable<IntWritable> values, Context context)
                    throws IOException, InterruptedException {
                    HashSet<IntWritable> duplicates = new HashSet();
                    ArrayList<Integer> tmp = new ArrayList();
                    for (IntWritable val : values) {
                            if(duplicates.contains(val))
                                    tmp.add(val.get());
                            else
                                    duplicates.add(val);
                    }
                    result.set(tmp.toString());
                    context.write(key, result);
            }
    }

    public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            Job job = Job.getInstance(conf, "Common Friends");
            job.setJarByClass(CommonFriends.class);
            job.setMapperClass(TokenizerMapper.class);
            job.setCombinerClass(IntSumReducer.class);
            job.setReducerClass(IntSumReducer.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(Text.class);
            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

Error: java.io.IOException: wrong value class: class org.apache.hadoop.io.Text is not class org.apache.hadoop.io.IntWritable at org.apache.hadoop.mapred.IFile$Writer.append(IFile.java:194) at org.apache.hadoop.mapred.Task$CombineOutputCollector.collect(Task.java:1350) at org.apache.hadoop.mapred.Task$NewCombinerRunner$OutputConverter.write(Task.java:1667) at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89) at org.apache.hadoop.mapreduce.lib.reduce.WrappedReducer$Context.write(WrappedReducer.java:105) at CommonFriends$IntSumReducer.reduce(CommonFriends.java:51) at CommonFriends$IntSumReducer.reduce(CommonFriends.java:38) at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:171) at org.apache.hadoop.mapred.Task$NewCombinerRunner.combine(Task.java:1688) at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1637) at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1489) at org.apache.hadoop.mapred.MapTask$NewOutputCollector.close(MapTask.java:723) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

这是我的代码,错误信息如下。 任何的想法?? 我认为 mapper 和 reducer 的输出类配置中的问题 输入文件是文件中的数字列表。 如果需要,将提供更多详细信息。 程序寻找好友之间的共同好友

最佳答案

在你的代码中删除 job.setCombinerClass(IntSumReducer.class); 可以解决这个问题

关于java - hadoop程序中的类型不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49664214/

相关文章:

hadoop - 如何知道hadoop homepath的默认位置

javascript - 将嵌套数组转换为 HTML 结构

java - Wildfly 8.2 : importing wildcard certificate, 中间证书丢失

hadoop - 关于如何在 MacOS 上将 Hadoop 2.2.0 (Yarn) 安装为单节点集群的好教程

hadoop - 使用 Cloudera 设置 Hadoop 集群的最快方法

java - 无法从集群网络外部的 Java 应用程序获取 HDFS 集群中文件的 InputStream

java - classOf [TextOutputFormat]需要Scala中的参数,但在Java中无需任何参数即可正常工作(TextOutputFormat.class)

java - 从对话框中获取文本?

java - JiBX Eclipse 插件未显示在 Rational Application Developer 8 中

java - 有没有一种方法可以使用 -cp 或 -jar 作为一个命令来运行多个 jar 文件?