Hadoop 环境安装部署
本章将详细介绍 Hadoop 集群的安装和配置过程,包括单机模式、伪分布式模式和完全分布式模式。
安装前准备
硬件要求
| 模式 | 最低配置 | 推荐配置 |
|---|---|---|
| 单机模式 | 2核 CPU,2GB 内存 | 4核 CPU,4GB 内存 |
| 伪分布式 | 2核 CPU,4GB 内存 | 4核 CPU,8GB 内存 |
| 完全分布式 | 每节点 2核 CPU,4GB 内存 | 每节点 4核 CPU,8GB 内存 |
软件要求
| 软件 | 版本要求 | 说明 |
|---|---|---|
| 操作系统 | Linux(CentOS 7+/Ubuntu 18.04+) | 生产环境推荐 Linux |
| Java | JDK 8 或 JDK 11 | Hadoop 3.x 推荐使用 JDK 8 |
| SSH | OpenSSH | 用于集群节点间通信 |
环境准备(Linux)
1. 安装 JDK
# CentOS/RHEL
sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# Ubuntu/Debian
sudo apt update
sudo apt install -y openjdk-8-jdk
# 验证安装
java -version
配置 JAVA_HOME 环境变量:
# 查找 Java 安装路径
readlink -f $(which java) | sed 's:/bin/java::'
# 编辑环境变量文件
sudo vim /etc/profile
# 添加以下内容
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$PATH:$JAVA_HOME/bin
# 使配置生效
source /etc/profile
2. 配置 SSH 免密登录
Hadoop 集群节点之间需要通过 SSH 进行通信,需要配置免密登录:
# 生成 SSH 密钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥复制到授权文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 设置权限
chmod 600 ~/.ssh/authorized_keys
# 测试免密登录
ssh localhost
对于完全分布式集群,需要将公钥复制到所有节点:
# 将公钥复制到远程节点
ssh-copy-id user@remote-host
# 测试免密登录
ssh user@remote-host
3. 关闭防火墙(可选)
生产环境建议配置防火墙规则,开发测试环境可以关闭防火墙:
# CentOS/RHEL
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# Ubuntu/Debian
sudo ufw disable
4. 配置主机名和 hosts 文件
对于完全分布式集群,需要配置每个节点的主机名:
# 设置主机名
sudo hostnamectl set-hostname namenode
# 编辑 hosts 文件
sudo vim /etc/hosts
# 添加集群节点映射
192.168.1.100 namenode
192.168.1.101 datanode1
192.168.1.102 datanode2
192.168.1.103 datanode3
下载和安装 Hadoop
下载 Hadoop
从 Apache 官方镜像站下载 Hadoop:
# 下载 Hadoop 3.3.6
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
# 解压到安装目录
tar -zxvf hadoop-3.3.6.tar.gz -C /opt/
# 创建软链接(方便版本管理)
ln -s /opt/hadoop-3.3.6 /opt/hadoop
配置环境变量
# 编辑环境变量文件
vim ~/.bashrc
# 添加 Hadoop 环境变量
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 使配置生效
source ~/.bashrc
# 验证安装
hadoop version
配置模式详解
单机模式
单机模式是最简单的部署方式,Hadoop 以单个 Java 进程运行,不涉及分布式特性。
适用场景:
- 学习 Hadoop 基本概念
- 开发和调试 MapReduce 程序
- 功能验证和单元测试
配置方法:
单机模式无需额外配置,使用默认配置即可运行。Hadoop 会使用本地文件系统而非 HDFS。
运行示例:
# 创建输入目录
mkdir -p ~/hadoop-input
# 创建测试文件
echo "hello world hello hadoop" > ~/hadoop-input/test.txt
# 运行 WordCount 示例
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount ~/hadoop-input ~/hadoop-output
# 查看结果
cat ~/hadoop-output/part-r-00000
伪分布式模式
伪分布式模式在单机上模拟分布式环境,HDFS、YARN 等组件都会启动,但都运行在同一台机器上。
适用场景:
- 开发和测试
- 学习 Hadoop 分布式特性
- 资源有限时的替代方案
配置文件
1. hadoop-env.sh
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# 设置 JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
2. core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 HDFS 的 NameNode 地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- 指定 Hadoop 临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
</configuration>
3. hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 副本数量(伪分布式设为 1) -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- NameNode 数据目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/data/namenode</value>
</property>
<!-- DataNode 数据目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/data/datanode</value>
</property>
<!-- Web UI 端口 -->
<property>
<name>dfs.namenode.http-address</name>
<value>localhost:9870</value>
</property>
</configuration>
4. mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce 运行在 YARN 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>localhost:10020</value>
</property>
</configuration>
5. yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- ResourceManager 地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>
<!-- NodeManager 运行的辅助服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 资源配置 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
</configuration>
启动集群
# 1. 格式化 NameNode(仅首次)
hdfs namenode -format
# 2. 启动 HDFS
start-dfs.sh
# 3. 启动 YARN
start-yarn.sh
# 4. 查看进程
jps
正常情况下应该看到以下进程:
25432 NameNode
25518 DataNode
25604 SecondaryNameNode
25789 ResourceManager
25875 NodeManager
验证安装
访问 Web UI:
- HDFS NameNode:http://localhost:9870
- YARN ResourceManager:http://localhost:8088
运行测试作业:
# 创建 HDFS 目录
hdfs dfs -mkdir -p /user/$(whoami)
# 上传测试文件
hdfs dfs -put ~/hadoop-input/test.txt /user/$(whoami)/
# 运行 WordCount
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/$(whoami)/test.txt /user/$(whoami)/output
# 查看结果
hdfs dfs -cat /user/$(whoami)/output/part-r-00000
完全分布式模式
完全分布式模式是生产环境的标准部署方式,集群由多台服务器组成,提供真正的分布式处理能力。
集群规划
以 4 节点集群为例:
| 节点 | 角色 | 运行服务 |
|---|---|---|
| node1 | Master | NameNode, ResourceManager |
| node2 | Slave | DataNode, NodeManager |
| node3 | Slave | DataNode, NodeManager |
| node4 | Slave | DataNode, NodeManager |
配置文件
1. core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
<!-- 代理用户配置 -->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
</configuration>
2. hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/data/datanode</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>node1:9870</value>
</property>
<!-- Secondary NameNode 地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node1:9868</value>
</property>
<!-- 数据块大小 -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
</configuration>
3. yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 资源配置 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<!-- 日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
4. mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
</configuration>
5. workers
vim $HADOOP_HOME/etc/hadoop/workers
# 添加 DataNode 节点
node2
node3
node4
分发配置
将配置好的 Hadoop 目录分发到所有节点:
# 使用 scp 分发
scp -r /opt/hadoop-3.3.6 node2:/opt/
scp -r /opt/hadoop-3.3.6 node3:/opt/
scp -r /opt/hadoop-3.3.6 node4:/opt/
# 在各节点创建软链接
ssh node2 "ln -s /opt/hadoop-3.3.6 /opt/hadoop"
ssh node3 "ln -s /opt/hadoop-3.3.6 /opt/hadoop"
ssh node4 "ln -s /opt/hadoop-3.3.6 /opt/hadoop"
启动集群
# 在 NameNode 节点执行
# 1. 格式化 NameNode(仅首次)
hdfs namenode -format
# 2. 启动 HDFS
start-dfs.sh
# 3. 启动 YARN
start-yarn.sh
# 4. 启动历史服务器
mr-jobhistory-daemon.sh start historyserver
验证集群
在各节点查看进程:
# node1
jps
# 应显示:NameNode, ResourceManager, SecondaryNameNode
# node2/node3/node4
jps
# 应显示:DataNode, NodeManager
访问 Web UI:
- HDFS:http://node1:9870
- YARN:http://node1:8088
- 历史服务器:http://node1:19888
常用运维命令
HDFS 相关
# 启动/停止 HDFS
start-dfs.sh
stop-dfs.sh
# 单独启动 NameNode
hadoop-daemon.sh start namenode
# 单独启动 DataNode
hadoop-daemon.sh start datanode
# 查看 HDFS 报告
hdfs dfsadmin -report
# 安全模式操作
hdfs dfsadmin -safemode get # 查看状态
hdfs dfsadmin -safemode enter # 进入安全模式
hdfs dfsadmin -safemode leave # 离开安全模式
YARN 相关
# 启动/停止 YARN
start-yarn.sh
stop-yarn.sh
# 单独启动 ResourceManager
yarn-daemon.sh start resourcemanager
# 单独启动 NodeManager
yarn-daemon.sh start nodemanager
# 查看应用列表
yarn application -list
# 杀死应用
yarn application -kill application_1234567890_0001
# 查看节点状态
yarn node -list
集群状态检查
# 检查 HDFS 健康状态
hdfs fsck /
# 检查数据块状态
hdfs fsck / -blocks
# 检查缺失块
hdfs fsck / -list-corruptfileblocks
# 查看 NameNode 日志
tail -f $HADOOP_HOME/logs/hadoop-*-namenode-*.log
常见问题排查
NameNode 启动失败
问题现象:NameNode 无法启动,日志显示 "NameNode is not formatted"
解决方案:
# 格式化 NameNode
hdfs namenode -format
注意:格式化会清空所有数据,生产环境谨慎操作。
DataNode 无法连接 NameNode
问题现象:DataNode 日志显示连接 NameNode 失败
排查步骤:
- 检查网络连通性:
ping namenode - 检查端口是否开放:
telnet namenode 9000 - 检查防火墙配置
- 检查 /etc/hosts 配置
YARN 任务执行失败
问题现象:任务提交后失败,提示资源不足
解决方案:
- 检查 NodeManager 资源配置
- 调整 yarn.scheduler.minimum-allocation-mb
- 检查任务资源需求是否超过集群容量
小结
本章介绍了 Hadoop 的三种部署模式:
-
单机模式:适合学习和开发调试,无需复杂配置。
-
伪分布式模式:在单机模拟分布式环境,适合测试和学习分布式特性。
-
完全分布式模式:生产环境标准部署,需要配置多节点集群。
选择合适的部署模式取决于你的使用场景。建议从单机模式开始学习,逐步过渡到伪分布式和完全分布式模式。