Wie gehe ich mit mehreren Eingabedateien in MapReduce um?

Wie gehe ich mit mehreren Eingabedateien in MapReduce um?

Die Möglichkeit, mehrere Eingabedateien in MapReduce zu verarbeiten, besteht in der Verwendung der MultipleInputs-Klasse. Mit der MultipleInputs-Klasse können wir für jede Eingabedatei unterschiedliche Mapper-Klassen angeben, sodass unterschiedliche Verarbeitungslogiken basierend auf unterschiedlichen Eingabedateien ausgeführt werden können.

Hier ist ein Beispielcode, der die MultipleInputs-Klasse verwendet, um mehrere Eingabedateien zu verarbeiten:

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class MultipleInputsExample {
    
    

    public static void main(String[] args) throws Exception {
    
    
        // 创建一个新的MapReduce作业
        Job job = Job.getInstance();
        job.setJarByClass(MultipleInputsExample.class);
        job.setJobName("MultipleInputsExample");

        // 设置多个输入文件路径和对应的Mapper类
        MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, Mapper1.class);
        MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, Mapper2.class);

        // 设置Reducer类和输出键值对类型
        job.setReducerClass(ReducerClass.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        // 设置输出文件路径
        FileOutputFormat.setOutputPath(job, new Path(args[2]));

        // 提交作业并等待完成
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

Im obigen Code erstellen wir zunächst einen neuen MapReduce-Job und legen den Namen und die Hauptklasse des Jobs fest. Anschließend verwenden wir die Methode addInputPath der Klasse MultipleInputs, um den Pfad und die entsprechende Mapper-Klasse für jede Eingabedatei anzugeben. In diesem Beispiel verwenden wir zwei Eingabedateien, die der Klasse Mapper1 bzw. der Klasse Mapper2 entsprechen.

Als Nächstes richten wir die Reducer-Klasse und den Typ der ausgegebenen Schlüssel-Wert-Paare ein. In diesem Beispiel ist die Reducer-Klasse ReducerClass und die Ausgabe-Schlüssel-Wert-Paartypen sind Text und LongWritable.

Schließlich legen wir den Pfad der Ausgabedatei fest, senden den Job und warten auf den Abschluss.

Unten finden Sie den Beispielcode für die Klassen Mapper1 und Mapper2:

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class Mapper1 extends Mapper<LongWritable, Text, Text, LongWritable> {
    
    

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    
    
        // 处理Mapper1的逻辑
        // ...
        context.write(new Text("output_key"), new LongWritable(1));
    }
}

public class Mapper2 extends Mapper<LongWritable, Text, Text, LongWritable> {
    
    

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    
    
        // 处理Mapper2的逻辑
        // ...
        context.write(new Text("output_key"), new LongWritable(1));
    }
}

In diesem Beispiel erben die Klasse Mapper1 und die Klasse Mapper2 jeweils von der Klasse Mapper und überschreiben die Map-Methode. In der Kartenmethode können wir unsere eigene Logik entsprechend den spezifischen Anforderungen implementieren. In diesem Beispiel ordnen wir einfach jeden Eingabedatensatz einem Schlüssel-Wert-Paar („output_key“, 1) zu.

Mögliche Laufergebnisse sind wie folgt:

output_key    2

In diesem Beispiel verwenden wir zwei Eingabedateien und verarbeiten sie mit der Mapper1-Klasse bzw. der Mapper2-Klasse. Das endgültige Ausgabeergebnis ist ein Schlüssel-Wert-Paar („output_key“, 2), was bedeutet, dass „output_key“ zweimal vorkommt.

Durch die Verwendung der MultipleInputs-Klasse können wir mehrere Eingabedateien in MapReduce verarbeiten und unterschiedliche Verarbeitungslogiken basierend auf unterschiedlichen Eingabedateien ausführen. Dies ermöglicht eine größere Flexibilität beim Umgang mit Daten aus unterschiedlichen Quellen und der entsprechenden Verarbeitung und Analyse.

Guess you like

Origin blog.csdn.net/qq_51447496/article/details/132747604