跳到主要内容

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
JavaJDK 8 或 JDK 11Hadoop 3.x 推荐使用 JDK 8
SSHOpenSSH用于集群节点间通信

环境准备(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 目录
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 节点集群为例:

节点角色运行服务
node1MasterNameNode, ResourceManager
node2SlaveDataNode, NodeManager
node3SlaveDataNode, NodeManager
node4SlaveDataNode, 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 相关

# 启动/停止 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 失败

排查步骤

  1. 检查网络连通性:ping namenode
  2. 检查端口是否开放:telnet namenode 9000
  3. 检查防火墙配置
  4. 检查 /etc/hosts 配置

YARN 任务执行失败

问题现象:任务提交后失败,提示资源不足

解决方案

  1. 检查 NodeManager 资源配置
  2. 调整 yarn.scheduler.minimum-allocation-mb
  3. 检查任务资源需求是否超过集群容量

小结

本章介绍了 Hadoop 的三种部署模式:

  1. 单机模式:适合学习和开发调试,无需复杂配置。

  2. 伪分布式模式:在单机模拟分布式环境,适合测试和学习分布式特性。

  3. 完全分布式模式:生产环境标准部署,需要配置多节点集群。

选择合适的部署模式取决于你的使用场景。建议从单机模式开始学习,逐步过渡到伪分布式和完全分布式模式。