Java >> Java tutorial >  >> Tag >> class

Foruddefinerede Mapper- og Reducer-klasser i Hadoop

Med i Hadoop framework er der nogle foruddefinerede Mapper og Reducer klasser, som kan bruges som de er i de påkrævede scenarier. På den måde er du ikke forpligtet til at skrive mapper eller reducering for disse scenarier, du kan bruge færdiglavede klasser i stedet.

Lad os se nogle af de foruddefinerede Mapper- og Reducer-klasser i Hadoop.

Foruddefinerede Mapper-klasser i Hadoop

  1. InverseMapper - Denne foruddefinerede mapper bytter nøgler og værdier. Så inputparret (nøgle, værdi) bliver omvendt, og nøglen bliver værdi og værdi bliver nøgle i outputparret (nøgle, værdi).
  2. TokenCounterMapper - Denne mapper tokeniserer inputværdierne og udsender hvert ord med en tælling på 1. Så den mapper du skriver i tilfælde af ordtælling MapReduce-program kan erstattes af denne indbyggede mapper. Se et eksempel på ordtællingsprogram, der bruger TokenCounterMapper og IntSumReducer.
  3. MultithreadedMapper - Dette er den flertrådede implementering af Mapper. Mapper-implementeringer, der bruger denne MapRunnable, skal være trådsikre.
  4. ChainMapper - ChainMapper-klassen gør det muligt at bruge flere Mapper-klasser inden for en enkelt kortopgave. Mapper-klasserne påkaldes på en kædet måde, outputtet fra den første Mapper bliver input fra den anden, og så videre, indtil den sidste Mapper, vil outputtet fra den sidste Mapper blive skrevet til opgavens output.
    • Se Sådan kæder du MapReduce Job i Hadoop for at se et eksempel på kædet mapper og kædet reducer sammen med InverseMapper.
  5. FieldSelectionMapper - Denne klasse implementerer en mapper-klasse, der kan bruges til at udføre feltvalg på en måde, der ligner Unix cut. Indtastningsdataene behandles som felter adskilt af en brugerspecificeret separator. Brugeren kan angive en liste over felter, der danner kortoutputtasterne, og en liste over felter, der danner kortoutputværdierne. Se et eksempel ved hjælp af FieldSelectionMapper senere.
  6. RegexMapper - Denne foruddefinerede Mapper-klasse i Hadoop udtrækker tekst fra input, der matcher et regulært udtryk.

Foruddefinerede Reducer-klasser i Hadoop

  1. IntSumReducer - Denne foruddefinerede Reducer-klasse summerer de heltalsværdier, der er knyttet til den specifikke nøgle.
  2. LongSumReducer - Denne foruddefinerede Reducer-klasse summerer de lange værdier, der er knyttet til den specifikke nøgle.
  3. FieldSelectionReducer - Denne klasse implementerer en reduceringsklasse, der kan bruges til at udføre feltvalg på en måde, der ligner Unix cut. Indtastningsdataene behandles som felter adskilt af en brugerspecificeret separator. Brugeren kan angive en liste over felter, der danner reduktionsoutputtasterne, og en liste over felter, der danner reduktionsoutputværdierne. Felterne er foreningen af ​​dem fra nøglen og dem fra værdien.
  4. Kædereducer - ChainReducer-klassen gør det muligt at kæde flere Mapper-klasser efter en Reducer i Reducer-opgaven. For hver post, der outputtes af Reducer, kaldes Mapper-klasserne på en kædet måde. Outputtet fra reduceringen bliver input fra den første Mapper, og output fra første bliver input fra den anden, og så videre, indtil den sidste Mapper, vil outputtet fra den sidste Mapper blive skrevet til opgavens output.
  5. WrappedReducer - En Reducer, der ombryder en given for at tillade brugerdefinerede Reducer.Context-implementeringer. Denne Reducer er nyttig, hvis du ønsker at implementere kontekstgrænsefladen.

Eksempler, der bruger foruddefinerede Mapper- og Reducer-klasser

Her er nogle eksempler, der bruger foruddefinerede Mapper- og Reducer-klasser.

Brug af FieldSelection Mapper

I eksemplet er der tabulatoradskilte inputdata, og du vil udtrække felt 0 som nøgle og felt 1 som værdi. I dette scenarie kan du bruge FieldSelectionMapper i stedet for at skrive din egen kortlægger.

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.Reducer;
import org.apache.hadoop.mapreduce.lib.fieldsel.FieldSelectionHelper;
import org.apache.hadoop.mapreduce.lib.fieldsel.FieldSelectionMapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class StockPrice extends Configured implements Tool{
  // Reduce function
  public static class MaxStockPriceReducer extends Reducer<Text, Text, Text, IntWritable>{

    public void reduce(Text key, Iterable values, Context context) 
        throws IOException, InterruptedException {
    System.out.println("key -- " + key.toString());
    int	maxValue = Integer.MIN_VALUE;
    for (Text val : values) {
      System.out.println("Value -- " + val);
      if(val != null && !val.toString().equals("")) {
        maxValue = Math.max(maxValue, Integer.parseInt(val.toString()));
      }
    }    
    System.out.println("maxValue -- " + maxValue);
    context.write(key, new IntWritable(maxValue));
    }
  }
	
	
  public static void main(String[] args) throws Exception {
    int exitFlag = ToolRunner.run(new StockPrice(), args);
    System.exit(exitFlag);
  }
	
  @Override
  public int run(String[] args) throws Exception {
    Configuration conf = new Configuration();
    // setting the separator
    conf.set(FieldSelectionHelper.DATA_FIELD_SEPERATOR, "\t");
    // Setting the fields that are to be extracted
    conf.set(FieldSelectionHelper.MAP_OUTPUT_KEY_VALUE_SPEC, "0:1");
    Job job = Job.getInstance(conf, "Stock price");
    job.setJarByClass(getClass());
    // setting the predefined mapper
    job.setMapperClass(FieldSelectionMapper.class);    

    job.setReducerClass(MaxStockPriceReducer.class);
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(Text.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    return job.waitForCompletion(true) ? 0 : 1;
  }
}

Brug af TokenCounterMapper og IntSumReducer til at skrive et ordantal MapReduce-program

I indlægget Word Count MapReduce Program i Hadoop har vi set et ord count MR program, hvor Map og Reduce funktionen er skrevet med i programmet, men du kan skrive et ord count MR program ved hjælp af foruddefinerede Mapper og Reducer klasser, hvor du blot skal angive klasserne TokenCounterMapper (foruddefineret Mapper-klasse) og IntSumReducer (foruddefineret Reducer-klasse).

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.map.TokenCounterMapper;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.reduce.IntSumReducer;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class SimpleWordCount extends Configured implements Tool{

  public static void main(String[] args) throws Exception{
    int exitFlag = ToolRunner.run(new SimpleWordCount(), args);
    System.exit(exitFlag);
  }

  @Override
  public int run(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "WC");
    job.setJarByClass(getClass());
    // Setting pre-defing mapper and reducer
    job.setMapperClass(TokenCounterMapper.class);    
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    return job.waitForCompletion(true) ? 0 : 1;
  }
}

Det er alt for emnet Foruddefinerede Mapper- og Reducer-klasser i Hadoop . Hvis der mangler noget, eller du har noget at dele om emnet, så skriv en kommentar.


Java tag