简介
本教程将指导你完成在 Hadoop 分布式文件系统(HDFS)中存储的数据上执行 MapReduce 作业的过程。你将学习如何设置 Hadoop 环境,并使用强大的 Hadoop 框架运行 MapReduce 作业来处理和分析大规模数据。
Hadoop 与 MapReduce 简介
什么是 Hadoop?
Hadoop 是一个开源软件框架,用于在分布式计算环境中存储和处理大型数据集。它旨在从单台服务器扩展到数千台机器,每台机器都提供本地计算和存储功能。Hadoop 基于谷歌文件系统(GFS)和 MapReduce 编程模型。
什么是 MapReduce?
MapReduce 是一种编程模型和软件框架,用于在分布式计算环境中处理大型数据集。它由两个主要任务组成:Map 任务和 Reduce 任务。Map 任务获取输入数据并将其转换为一组键值对,而 Reduce 任务获取 Map 任务的输出并将这些数据元组合并为一组更小的元组。
graph LR
A[输入数据] --> B[Map 任务]
B --> C[混洗与排序]
C --> D[Reduce 任务]
D --> E[输出数据]
Hadoop 和 MapReduce 的优势
- 可扩展性:Hadoop 可以扩展到数千个节点,从而能够处理大型数据集。
- 容错性:Hadoop 旨在处理硬件故障,确保即使个别节点出现故障,系统仍能继续运行。
- 成本效益:Hadoop 运行在普通硬件上,使其成为大数据处理的经济高效解决方案。
- 灵活性:Hadoop 可以处理各种数据类型,包括结构化、半结构化和非结构化数据。
- 并行处理:MapReduce 允许对数据进行并行处理,从而提高系统的整体性能。
Hadoop 和 MapReduce 的应用
Hadoop 和 MapReduce 在各种行业中都有广泛应用,包括:
- 网络搜索:对大型网页进行索引和搜索
- 电子商务:分析客户行为和偏好
- 生物信息学:处理和分析大型基因组数据集
- 金融:检测欺诈行为并分析金融数据
- 社交媒体:分析用户行为和情绪
准备 Hadoop 环境
安装 Java
Hadoop 需要系统上安装 Java。你可以使用以下命令安装最新版本的 Java:
sudo apt-get update
sudo apt-get install -y openjdk-11-jdk
下载并解压 Hadoop
从官方网站下载最新版本的 Hadoop:https://hadoop.apache.org/releases.html
使用以下命令解压下载的文件:
tar -xzf hadoop-3.3.4.tar.gz
配置 Hadoop 环境变量
在文本编辑器中打开
.bashrc文件:nano ~/.bashrc在文件中添加以下行:
export HADOOP_HOME=/path/to/hadoop-3.3.4 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin保存文件并退出文本编辑器。
重新加载
.bashrc文件:source ~/.bashrc
配置 Hadoop 配置文件
导航到 Hadoop 配置目录:
cd $HADOOP_HOME/etc/hadoop打开
core-site.xml文件并添加以下配置:<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>打开
hdfs-site.xml文件并添加以下配置:<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>保存配置文件。
格式化 HDFS 名称节点
初始化 HDFS 名称节点:
hdfs namenode -format启动 HDFS 守护进程:
start-dfs.sh验证 HDFS 是否正在运行:
jps你应该看到
NameNode、DataNode和SecondaryNameNode进程正在运行。
恭喜!你现在已经在 Ubuntu 22.04 系统上设置好了 Hadoop 环境。
在 HDFS 上执行 MapReduce 作业
准备输入数据
在 HDFS 中创建一个目录来存储输入数据:
hdfs dfs -mkdir /input将输入数据复制到 HDFS 目录:
hdfs dfs -put /path/to/input/data /input
编写 MapReduce 作业
在你喜欢的 IDE 中创建一个新的 Java 项目。
将 Hadoop 依赖项添加到你的项目中:
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.4</version> </dependency> </dependencies>为你的 MapReduce 作业创建一个新的 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.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCount { public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> { // 实现 map 逻辑 } public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { // 实现 reduce 逻辑 } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path("/input")); FileOutputFormat.setOutputPath(job, new Path("/output")); System.exit(job.waitForCompletion(true)? 0 : 1); } }
执行 MapReduce 作业
编译 MapReduce 作业:
mvn clean package运行 MapReduce 作业:
hadoop jar target/word-count-1.0-SNAPSHOT.jar WordCount在 HDFS 输出目录中检查输出:
hdfs dfs -ls /output hdfs dfs -cat /output/part-r-00000
恭喜!你已经使用 Hadoop 在 HDFS 数据上成功执行了一个 MapReduce 作业。
总结
在本 Hadoop 教程中,你已经学习了如何准备 Hadoop 环境以及在 HDFS 数据上执行 MapReduce 作业。通过理解 Hadoop 和 MapReduce 的基本原理,你现在可以利用这个分布式计算框架的强大功能来高效地处理和分析海量数据集。


