En aquest tema, explorarem el flux de treball d'una feina MapReduce, des de la seva submissió fins a la seva finalització. MapReduce és un model de programació per al processament de grans volums de dades de manera distribuïda. Comprendre el flux de treball és essencial per optimitzar i depurar les feines MapReduce.

  1. Submissió de la feina

Quan un usuari vol executar una feina MapReduce, segueix aquests passos:

  1. Escriure el codi MapReduce: L'usuari escriu el codi per a les funcions Mapper i Reducer.
  2. Configuració de la feina: L'usuari configura la feina especificant els detalls com el nom de la feina, les classes Mapper i Reducer, els camins d'entrada i sortida, etc.
  3. Submissió de la feina: L'usuari envia la feina al clúster Hadoop utilitzant l'API de MapReduce o eines de línia de comandes.
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.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);

  1. Divisió de les dades d'entrada

Un cop la feina és enviada, el sistema Hadoop divideix les dades d'entrada en fragments més petits anomenats "splits". Cada split és processat per una instància de Mapper.

  • InputFormat: Defineix com les dades d'entrada es divideixen en splits.
  • RecordReader: Llegeix les dades d'entrada i les converteix en parells clau-valor per al Mapper.

  1. Execució del Mapper

Cada split és assignat a una instància de Mapper que processa els parells clau-valor d'entrada i genera parells clau-valor intermedis.

public class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
            word.set(itr.nextToken());
            context.write(word, one);
        }
    }
}

  1. Particionament

Els parells clau-valor intermedis generats pels Mapper són particionats segons la clau. Cada partició és assignada a un Reducer.

  • Partitioner: Determina a quin Reducer s'envia cada parell clau-valor intermedi.

  1. Ordenació i combinació

Abans que els parells clau-valor intermedis arribin als Reducer, són ordenats per clau. A més, es pot aplicar una combinació local per reduir la quantitat de dades transferides.

  • Combiner: Una versió local del Reducer que s'executa al node Mapper per reduir les dades intermedies.
public class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        context.write(key, result);
    }
}

  1. Execució del Reducer

Els Reducer processen els parells clau-valor intermedis ordenats i generen els resultats finals.

  • Reducer: Agrega els valors associats a cada clau i escriu els resultats finals.

  1. Escriure els resultats

Els resultats finals generats pels Reducer són escrits al sistema de fitxers distribuït (HDFS).

  • OutputFormat: Defineix com els resultats finals es guarden a HDFS.

  1. Finalització de la feina

Un cop tots els Mapper i Reducer han completat la seva execució, la feina es marca com a completada. L'usuari pot consultar els resultats a HDFS.

Resum

El flux de treball d'una feina MapReduce implica diversos passos clau: submissió de la feina, divisió de les dades d'entrada, execució del Mapper, particionament, ordenació i combinació, execució del Reducer, i escriptura dels resultats. Comprendre aquest flux és essencial per optimitzar i depurar les feines MapReduce.

En el següent tema, explorarem com escriure un programa MapReduce detalladament.

© Copyright 2024. Tots els drets reservats