- Hadoop 2.x 核心架构演进:理解为什么 Hadoop 2.x 如此重要。
- 环境准备:搭建 Hadoop 2.x 的运行环境(伪分布式模式)。
- HDFS 核心操作:分布式文件系统的常用命令。
- YARN 核心概念:理解新的资源管理框架。
- MapReduce on YARN:如何在 YARN 上运行一个经典的 WordCount 程序。
- 总结与展望。
Hadoop 2.x 核心架构演进:从 1.x 到 2.x
在 Hadoop 1.x 中,架构相对简单,主要由 HDFS 和 MapReduce 两部分组成,但存在一个严重问题:MapReduce 的 JobTracker 同时承担了资源管理和任务调度两大职责,成为了性能瓶颈,导致集群难以扩展。

Hadoop 2.x 的核心改进就是引入了 YARN,将资源管理和任务调度分离,实现了更通用、更强大的资源管理框架。
Hadoop 1.x 架构
- JobTracker: 负责整个作业的调度和监控,管理 TaskTracker 的资源,它是一个单点故障源,且负载过高。
- TaskTracker: 负责执行具体的任务(Map Task 和 Reduce Task),并向 JobTracker 汇报心跳和任务状态。
Hadoop 2.x (YARN) 架构
YARN 将 JobTracker 的功能拆分成了两个独立的组件:
-
ResourceManager (RM):
- 全局资源管理者:负责整个集群的资源管理和分配。
- 它接收来自客户端的作业请求,并在 NodeManager 的帮助下为作业分配容器。
- 它是一个全局唯一的进程,是集群的“大脑”。
-
NodeManager (NM):
(图片来源网络,侵删)- 单节点资源管理者:负责集群中单个节点的资源管理和任务执行。
- 它会监控自己节点的资源(CPU、内存)并向 RM 汇报。
- 它接收来自 AM 的任务,并负责启动和监控容器 中的任务。
-
ApplicationMaster (AM):
- 应用程序管家:每个应用程序(如一个 MapReduce 作业)都有自己的 AM。
- 它的生命周期与应用程序相同,AM 的主要职责是与 RM 协商资源,并与 NM 协作来执行和监控任务。
- MapReduce 的 AM 会与 RM 协商获取 Map 和 Reduce Task 所需的容器,然后让 NM 在这些容器中启动 Task。
YARN 的优势:
- 通用性:YARN 不仅仅可以运行 MapReduce,还可以运行 Spark、Flink、Hive 等多种计算框架,真正实现了“计算与存储分离”。
- 可扩展性:资源管理和任务调度分离,集群可以轻松扩展到数千个节点。
- 高可用性:RM 可以配置为 Active/Standby 模式,避免了单点故障。
环境准备:伪分布式模式安装
伪分布式模式是学习和开发 Hadoop 最便捷的方式,它在单个机器上模拟了多节点的集群环境,所有的 Hadoop 进程(NameNode, DataNode, ResourceManager, NodeManager 等)都在这台机器上以独立进程的形式运行。
1 系统要求
- 操作系统: Linux (推荐 CentOS 7/8 或 Ubuntu 18.04/20.04)
- Java: Hadoop 2.x 要求 Java 7 或更高版本,推荐使用 OpenJDK 7/8。
- Hadoop: 下载稳定版本,如 Hadoop 2.10.x。
2 安装步骤
步骤 1: 创建 Hadoop 用户
sudo useradd -m hadoop -s /bin/bash sudo passwd hadoop sudo usermod -aG sudo hadoop
切换到 hadoop 用户:
su - hadoop
步骤 2: 安装 Java
# Ubuntu sudo apt update sudo apt install openjdk-8-jdk -y # CentOS sudo yum install java-1.8.0-openjdk-devel -y
配置环境变量 ~/.bashrc:
echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64' >> ~/.bashrc echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc source ~/.bashrc
验证安装:java -version
步骤 3: 下载并解压 Hadoop
wget https://archive.apache.org/dist/hadoop/core/hadoop-2.10.1/hadoop-2.10.1.tar.gz tar -xzvf hadoop-2.10.1.tar.gz mv hadoop-2.10.1 ~/hadoop
配置环境变量 ~/.bashrc:
echo 'export HADOOP_HOME=/home/hadoop/hadoop' >> ~/.bashrc echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc source ~/.bashrc
验证安装:hadoop version
步骤 4: 配置 Hadoop
进入 Hadoop 配置目录 cd ~/hadoop/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> <!-- 伪分布式模式,副本数为1 --> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/hadoop/hadoop_data/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///home/hadoop/hadoop_data/datanode</value> </property> </configuration>注意:创建上述目录
mkdir -p ~/hadoop_data/{namenode,datanode} -
yarn-site.xml:<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property> </configuration> -
mapred-site.xml(需要从mapred-site.xml.template复制):cp mapred-site.xml.template mapred-site.xml
然后编辑
mapred-site.xml:<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
步骤 5: 配免密登录 Hadoop 进程之间需要通信,配置 SSH 免密登录。
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 0600 ~/.ssh/authorized_keys
测试免密登录:ssh localhost
步骤 6: 格式化 HDFS 并启动集群
# 格式化文件系统(首次启动必须执行,后续不要轻易执行) hdfs namenode -format # 启动 HDFS start-dfs.sh # 启动 YARN start-yarn.sh
步骤 7: 验证集群
使用 jps 命令检查进程:
jps
你应该能看到以下进程(顺序可能不同):
NameNodeDataNodeSecondaryNameNodeResourceManagerNodeManager
访问 Web UI:
- HDFS:
http://localhost:9870 - YARN:
http://localhost:8088
HDFS 核心操作
HDFS (Hadoop Distributed File System) 是 Hadoop 的存储基石。
1 基本命令
- 创建目录:
hdfs dfs -mkdir /input
- 上传本地文件到 HDFS:
# 假设有一个本地文件 local.txt hdfs dfs -put local.txt /input/
- 查看 HDFS 文件列表:
hdfs dfs -ls /input
- 查看 HDFS 文件内容:
hdfs dfs -cat /input/local.txt
- 从 HDFS 下载文件到本地:
hdfs dfs -get /input/local.txt downloaded.txt
- 删除 HDFS 文件/目录:
hdfs dfs -rm -r /input
YARN 核心概念
- Container (容器): YARN 资源分配的基本单位,它包含了一组资源(如 vCPU, 内存)以及运行任务所需的环境信息。
- Application (应用程序): 一个完整的计算任务,比如一个 MapReduce 作业、一个 Spark 应用。
- ApplicationMaster (AM): 每个应用一个,负责向 RM 申请资源,并与 NM 协作来执行任务。
- ResourceManager (RM): 集群的“大脑”,负责全局资源调度。
- NodeManager (NM): 每个节点一个,负责节点的资源管理和任务执行。
YARN 运行一个应用的生命周期:
- 客户端向 RM 提交一个应用。
- RM 为该应用分配一个容器,并在其中启动 AM。
- AM 向 RM 注册自己,并开始向 RM 申请运行任务所需的资源。
- RM 根据集群资源情况,将可用的容器分配给 AM。
- AM 与对应的 NM 通信,指示 NM 在分配的容器中启动任务。
- NM 启动任务,并将任务的状态和进度汇报给 AM。
- AM 将任务的状态和进度汇报给 RM,客户端可以通过 RM 查看应用状态。
- 所有任务完成后,AM 注销,RM 回收该应用的资源。
MapReduce on YARN:WordCount 示例
我们将运行 Hadoop 自带的 WordCount 示例程序。
步骤 1: 准备输入数据
我们使用 HDFS 上的 /input 目录作为输入,如果没有数据,可以创建一个。
# 在 HDFS 的 /input 目录下创建一个文件 echo "hello world hello hadoop" | hdfs dfs -put - /input/test.txt echo "mapreduce is powerful" | hdfs dfs -appendToFile - /input/test.txt
步骤 2: 运行 WordCount 程序 Hadoop 的 JAR 包中包含了示例程序。
hadoop jar ~/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /input /output
hadoop-mapreduce-examples-2.10.1.jar: 包含示例程序的 JAR 包。wordcount: 要运行的类名。/input: 输入数据目录。/output: 输出结果目录(该目录不能事先存在)。
步骤 3: 查看结果
程序运行成功后,结果会存放在 /output 目录下,通常会有一个 part-r-00000 文件。
hdfs dfs -cat /output/part-r-00000
你将看到类似下面的输出:
hadoop 1
hello 2
is 1
mapreduce 1
powerful 1
world 1
步骤 4: 在 YARN Web UI 上查看
打开浏览器访问 http://localhost:8088,你可以在 "Applications" 标签页下看到刚刚运行的 "wordcount" 作业,点击可以查看详细的任务日志、资源使用情况等。
总结与展望
恭喜你!你已经成功搭建了 Hadoop 2.x 伪分布式集群,并运行了第一个 MapReduce 作业,理解了其核心架构。
回顾要点:
- Hadoop 2.x 的核心是 YARN,它实现了资源管理和任务调度的分离,带来了通用性和可扩展性。
- HDFS 是分布式存储的基础。
- YARN 是分布式计算的资源管理平台,MapReduce、Spark 等都运行在它之上。
下一步可以学习什么?
- 真正的集群部署: 了解如何配置多个节点,实现高可用(HA)和联邦。
- 更高级的 MapReduce: 学习自定义 Mapper 和 Reducer,处理复杂的数据逻辑。
- Spark: 学习如何在 YARN 上运行 Spark,这是目前更主流的大数据处理框架。
- Hive 和 HBase: 学习基于 HDFS 的数据仓库(Hive)和 NoSQL 数据库(HBase)。
- Hadoop 生态系统: 探索 ZooKeeper, Flume, Sqoop, Kafka 等其他组件。
这份教程为你打下了坚实的基础,希望对你学习 Hadoop 有所帮助!
