大数据之hadoop MapReduce 作业输入案例 多文件实践

大数据阿木 发布于 5 天前 1 次阅读


Hadoop MapReduce 作业输入案例:多文件实践

Hadoop MapReduce 是一种分布式计算框架,它允许在大量数据集上进行并行处理。MapReduce 模型由两个主要阶段组成:Map 阶段和 Reduce 阶段。Map 阶段将输入数据分解成键值对,而 Reduce 阶段则对 Map 阶段生成的键值对进行聚合处理。本文将围绕一个多文件输入的 MapReduce 作业案例,详细介绍如何使用 Hadoop 和 MapReduce 进行数据处理。

环境准备

在开始之前,请确保您已经安装了 Hadoop 环境。以下是在 Linux 系统上安装 Hadoop 的基本步骤:

1. 下载 Hadoop 安装包。

2. 解压安装包到指定目录。

3. 配置 Hadoop 环境,包括设置 Hadoop 配置文件。

4. 启动 Hadoop 集群。

作业描述

假设我们有一个包含多个文本文件的目录,每个文件包含一些学生信息,格式如下:


姓名,年龄,性别,成绩


张三,20,男,90


李四,21,女,85


王五,22,男,95


赵六,23,女,88


我们的目标是统计每个性别学生的平均成绩。

Map 阶段

Map 阶段负责读取输入文件,将每行数据解析为键值对,并输出到输出数据集中。以下是一个简单的 Map 阶段代码示例:

java

import org.apache.hadoop.io.IntWritable;


import org.apache.hadoop.io.Text;


import org.apache.hadoop.mapreduce.Mapper;

public class StudentMapper extends Mapper<Object, Text, Text, IntWritable> {

private final static IntWritable one = new IntWritable(1);


private Text gender = new Text();

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


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


if (tokens.length == 4) {


gender.set(tokens[2]); // 设置性别为键


context.write(gender, one); // 输出键值对


}


}


}


Shuffle 阶段

Shuffle 阶段是 MapReduce 框架中的一个重要阶段,它负责将 Map 阶段输出的键值对按照键进行排序,并将具有相同键的数据发送到同一个 Reduce 任务。

Reduce 阶段

Reduce 阶段负责对 Shuffle 阶段输出的键值对进行聚合处理。以下是一个简单的 Reduce 阶段代码示例:

java

import org.apache.hadoop.io.IntWritable;


import org.apache.hadoop.io.Text;


import org.apache.hadoop.mapreduce.Reducer;

public class StudentReducer 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);


}


}


完整的 MapReduce 作业

以下是一个完整的 MapReduce 作业示例,它包含了 Map、Shuffle 和 Reduce 阶段:

java

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.lib.input.FileInputFormat;


import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class StudentAverage {

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


Configuration conf = new Configuration();


Job job = Job.getInstance(conf, "student average");


job.setJarByClass(StudentAverage.class);


job.setMapperClass(StudentMapper.class);


job.setCombinerClass(StudentReducer.class);


job.setReducerClass(StudentReducer.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);


}


}


运行作业

在 Hadoop 环境中,可以使用以下命令运行 MapReduce 作业:

shell

hadoop jar student-average.jar StudentAverage /input/student_data /output


其中,`student-average.jar` 是包含 MapReduce 作业的 JAR 文件,`/input/student_data` 是输入文件所在的目录,`/output` 是输出结果将保存的目录。

总结

本文通过一个多文件输入的 MapReduce 作业案例,介绍了如何使用 Hadoop 和 MapReduce 进行数据处理。通过 Map 阶段和 Reduce 阶段的协同工作,我们可以有效地处理大量数据,并从中提取有价值的信息。在实际应用中,MapReduce 可以扩展到数千个节点,从而实现大规模的数据处理。