java - loisirs - sigale charnay les macon



Le compteur ne fonctionne pas dans le code du réducteur (1)

Je travaille sur un projet Big Hadoop et il y a un petit KPI, où je dois écrire seulement les 10 premières valeurs pour réduire la production. Pour compléter cette exigence, j'ai utilisé un compteur et rompu la boucle lorsque le compteur est égal à 11, mais toujours le réducteur écrit toutes les valeurs dans HDFS.

Ceci est un code java assez simple, mais je suis coincé :(

Pour tester, j'ai créé une classe autonome (application java) pour faire ceci et cela fonctionne là; Je me demande pourquoi cela ne fonctionne pas dans le code réducteur.

S'il vous plaît quelqu'un m'aider et suggérer si je manque quelque chose.

MAP - REDUIRE LE CODE

package comparableTest;
import java.io.IOException;
import java.nio.ByteBuffer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.IntWritable.Comparator;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparator;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

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

        Configuration conf = new Configuration(true);

        String arguments[] = new GenericOptionsParser(conf, args).getRemainingArgs();

        Job job = new Job(conf, "Test commond");
        job.setJarByClass(ValueSortExp2.class);

        // Setup MapReduce
        job.setMapperClass(MapTask2.class);
        job.setReducerClass(ReduceTask2.class);
        job.setNumReduceTasks(1);

        // Specify key / value
        job.setMapOutputKeyClass(IntWritable.class);
        job.setMapOutputValueClass(Text.class);
        job.setOutputKeyClass(IntWritable.class);
        job.setOutputValueClass(Text.class);
        job.setSortComparatorClass(IntComparator2.class);
        // Input
        FileInputFormat.addInputPath(job, new Path(arguments[0]));
        job.setInputFormatClass(TextInputFormat.class);

        // Output
        FileOutputFormat.setOutputPath(job, new Path(arguments[1]));
        job.setOutputFormatClass(TextOutputFormat.class);


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

    }

    public static class IntComparator2 extends WritableComparator {

        public IntComparator2() {
            super(IntWritable.class);
        }

        @Override
        public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {

            Integer v1 = ByteBuffer.wrap(b1, s1, l1).getInt();
            Integer v2 = ByteBuffer.wrap(b2, s2, l2).getInt();

            return v1.compareTo(v2) * (-1);
        }
    }

    public static class MapTask2 extends Mapper<LongWritable, Text, IntWritable, Text> {

            public void  map(LongWritable key,Text value, Context context) throws IOException, InterruptedException {

                String tokens[]= value.toString().split("\\t");

            //    int empId = Integer.parseInt(tokens[0])    ;    
                int count = Integer.parseInt(tokens[2])    ;

                context.write(new IntWritable(count), new Text(value));

            }    

        }


    public static class ReduceTask2 extends Reducer<IntWritable, Text, IntWritable, Text> {
        int cnt=0;
        public void reduce(IntWritable key, Iterable<Text> list, Context context)
                throws java.io.IOException, InterruptedException {


            for (Text value : list ) {
                cnt ++;

                if (cnt==11)
                {
                    break;    
                }

                context.write(new IntWritable(cnt), value);




            }

        }
}
}  

CODE JAVA SIMPLE WOKING FINE

package comparableTest;

import java.io.IOException;
import java.util.ArrayList;

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

public class TestData {

    //static int cnt=0;


    public static void main(String args[]) throws IOException, InterruptedException {

        ArrayList<String> list = new ArrayList<String>() {{
            add("A");
            add("B");
            add("C");
            add("D");
        }};


        reduce(list);


    }

    public static void reduce(Iterable<String> list)
            throws java.io.IOException, InterruptedException {


        int cnt=0;
        for (String value : list ) {
            cnt ++;

            if (cnt==3)
            {
                break;    
            }

            System.out.println(value);    


        }

    }
}

Exemple de données --Header est seulement plus d'informations, les données réelles sont à partir de la 2ème ligne

` ID NAME COUNT (besoin d'afficher les 10 meilleurs desc)

1 Histoire de jouets (1995) 2077

10 GoldenEye (1995) 888

100 hôtel de ville (1996) 128

1000 caillé (1996) 20

1001 Associate, The (L'Associe) (1982) 0

1002 Ed's Next Move (1996) 8

1003 Mesures extrêmes (1996) 121

1004 Glimmer Man, The (1996) 101

1005 D3: Les Mighty Ducks (1996) 142

1006 Chambre, The (1996) 78

1007 Apple Dumpling Gang, Le (1975) 232

1008 Davy Crockett, roi de la frontière sauvage (1955) 97

1009 Escape to Witch Mountain (1975) 291

101 Bottle Rocket (1996) 253

1010 Love Bug, Le (1969) 242

1011 Herbie Rides Again (1974) 135

1012 Old Yeller (1957) 301

1013 Parent Trap, The (1961) 258

1014 Pollyanna (1960) 136

1015 Homeward Bound: L'incroyable voyage (1993) 234

1016 Shaggy Dog, Les (1959) 156

1017 La famille suisse Robinson (1960) 276

1018 Ce chat infâme! (1965) 123

1019 20 000 lieues sous la mer (1954) 575

102 M. Wrong (1996) 60

1020 Cool Runnings (1993) 392

1021 Anges dans l'Outfield (1994) 247

1022 Cendrillon (1950) 577

1023 Winnie l'ourson et la journée venteuse (1968) 221

1024 Trois Caballeros, Le (1945) 126

1025 Épée dans la pierre, The (1963) 293

1026 Chers à mon coeur (1949) 8

1027 Robin des Bois: Prince of Thieves (1991) 344

1028 Mary Poppins (1964) 1011

1029 Dumbo (1941) 568

103 Inoubliable (1996) 33

1030 Le dragon de Pete (1977) 323

1031 Boutons de lit et balais (1971) 319`


Si vous déplacez int cnt=0; à l'intérieur de la méthode de réduction (comme la première déclaration de cette méthode), vous obtiendrez les 10 premières valeurs pour chaque clé (je suppose que c'est ce que vous voulez).

Sinon, comme c'est le cas maintenant, votre compteur continuera à augmenter et vous passerez la 11e valeur seulement (peu importe la clé), en continuant avec le 12e.

Si vous voulez imprimer seulement 10 valeurs (indépendamment de la clé), vous laissez l'initialisation cnt où elle est, et changez votre condition if (cnt > 10) ... Cependant, ce n'est pas une bonne pratique, alors vous pouvez besoin de reconsidérer votre algorithme. (en supposant que vous ne voulez pas 10 valeurs aléatoires, comment savez-vous quelle clé sera traitée en premier dans un environnement distribué, lorsque vous avez plus de 1 réducteurs et un partitionneur de hachage?)





hadoop2