java - write - wordcount hadoop code



Le fichier de sortie contient la sortie Mapper au lieu de la sortie Réducteur (1)

Vous ne pouvez pas utiliser votre classe IntSumReducer tant que combineur. Un combineur doit recevoir et émettre les mêmes types de clé / valeur.

Donc, je voudrais supprimer job.setCombinerClass(IntSumReducer.class); .

Rappelez-vous la sortie de la moissonneuse-batteuse est l'entrée à la réduction, donc l'écriture de Text et IntWritable va pas fonctionner.

Si vos fichiers de sortie ressemblaient à part-m-xxxxx alors le problème ci-dessus pourrait signifier qu'il n'a exécuté que la phase Map et qu'il s'est arrêté. Vos compteurs le confirmeraient.

Vous avez également Reducer<Text,Object,Text,IntWritable> qui devrait être Reducer<Text,SumCount,Text,IntWritable> .

Salut J'essaie de trouver la moyenne de quelques nombres en utilisant la technique de réduction de carte en mode autonome. J'ai deux fichiers d'entrée. Il contient les valeurs file1: 25 25 25 25 25 et file2: 15 15 15 15 15 .

Mon programme fonctionne bien mais le fichier de sortie contient la sortie du mappeur au lieu de la sortie du réducteur.

Voici mon code:

import java.io.IOException;
import java.util.StringTokenizer;
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;
import org.apache.hadoop.io.Writable;
import java.io.*;


public class Average {

    public static class SumCount implements Writable {

        public int sum;
        public int count;

        @Override
        public void write(DataOutput out) throws IOException {
            out.writeInt(sum);
            out.writeInt(count);
        }

        @Override
        public void readFields(DataInput in) throws IOException {
            sum = in.readInt();
            count =in.readInt();
        }  
    }
  public static class TokenizerMapper extends Mapper<Object, Text, Text, Object>{

    private final static IntWritable valueofkey = new IntWritable();
    private Text word = new Text();
    SumCount sc=new SumCount();
    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      int sum=0;
      int count=0;
      int v;
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        v=Integer.parseInt(word.toString());
        count=count+1;
        sum=sum+v;       
      }
      word.set("average");
      sc.sum=sum;
      sc.count=count;
      context.write(word,sc);
    }
  }

  public static class IntSumReducer extends Reducer<Text,Object,Text,IntWritable> {
    private IntWritable result = new IntWritable();
    public void reduce(Text key, Iterable<SumCount> values,Context context) throws IOException, InterruptedException {
      int sum = 0;
      int count=0;
      int wholesum=0;
      int wholecount=0;
      for (SumCount val : values) {
        wholesum=wholesum+val.sum;
        wholecount=wholecount+val.count;
      }
      int res=wholesum/wholecount;
      result.set(res);
      context.write(key, result );
    }
  }

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

après avoir exécuté le programme mon fichier de sortie est comme ceci:

average [email protected]
average [email protected]




mapreduce