1. Hadoop集群搭建前的准备工作
搭建Hadoop集群前,我们需要做好充分的准备工作。首先确保你拥有至少三台配置相同的服务器(物理机或虚拟机),建议使用CentOS 7.x操作系统。这三台服务器将分别作为集群的主节点(NameNode)和从节点(DataNode)。
提示:生产环境建议使用专用服务器而非虚拟机,且所有节点应配置SSH免密登录,这在后续集群管理时会非常方便。
1.1 系统环境检查
在开始安装前,我们需要检查并确保系统环境符合Hadoop运行要求:
bash复制# 检查系统版本
cat /etc/redhat-release
# 检查内存和CPU
free -h
lscpu
# 检查磁盘空间
df -h
建议每台服务器至少配置:
- 4核CPU
- 8GB内存
- 50GB可用磁盘空间
1.2 网络配置
集群节点间需要保持网络畅通,建议配置静态IP并修改主机名:
bash复制# 修改主机名(三台机器分别执行)
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
# 配置hosts文件(三台机器相同配置)
vim /etc/hosts
# 添加以下内容
192.168.1.101 node1
192.168.1.102 node2
192.168.1.103 node3
2. 软件安装与配置
2.1 上传安装包
首先我们需要将Hadoop和JDK安装包上传到服务器。这里使用lrzsz工具进行文件上传:
bash复制# 创建软件存放目录
mkdir -p /export/software
cd /export/software
# 安装lrzsz工具
yum -y install lrzsz
# 上传文件(执行后会弹出文件选择窗口)
rz
注意:如果是在纯命令行环境没有GUI,可以使用scp命令从本地传输文件:
scp hadoop-3.3.5.tar.gz jdk-8u371-linux-x64.tar.gz root@node1:/export/software/
2.2 JDK安装与配置
2.2.1 卸载系统自带JDK
CentOS系统通常自带OpenJDK,我们需要先卸载它们:
bash复制# 查找已安装的JDK包
rpm -qa | grep jdk
# 卸载所有查找到的JDK包(根据实际查询结果调整)
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.262.b10-1.el7.x86_64
rpm -e --nodeps copy-jdk-configs-3.3-10.el7_5.noarch
rpm -e --nodeps java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64
2.2.2 安装Oracle JDK
bash复制# 解压JDK到指定目录
tar -zxvf jdk-8u371-linux-x64.tar.gz -C /export/servers/
# 重命名JDK目录
cd /export/servers/
mv jdk1.8.0_371 jdk
# 配置环境变量
vim /etc/profile
在文件末尾添加以下内容:
bash复制export JAVA_HOME=/export/servers/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
使配置生效:
bash复制source /etc/profile
# 验证安装
java -version
预期输出应显示类似:
code复制java version "1.8.0_371"
Java(TM) SE Runtime Environment (build 1.8.0_371-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode)
3. Hadoop集群安装与配置
3.1 Hadoop安装
bash复制# 解压Hadoop安装包
cd /export/software
tar -zxvf hadoop-3.3.5.tar.gz -C /export/servers/
# 重命名Hadoop目录
cd /export/servers/
mv hadoop-3.3.5 hadoop
# 配置环境变量
vim /etc/profile
添加以下内容:
bash复制export HADOOP_HOME=/export/servers/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使配置生效:
bash复制source /etc/profile
# 验证安装
hadoop version
3.2 Hadoop配置文件修改
Hadoop的核心配置文件位于/export/servers/hadoop/etc/hadoop/目录下,我们需要修改以下几个关键文件:
3.2.1 hadoop-env.sh
bash复制vim hadoop-env.sh
找到JAVA_HOME配置行,修改为:
bash复制export JAVA_HOME=/export/servers/jdk
3.2.2 core-site.xml
xml复制<configuration>
<!-- 指定HDFS的NameNode地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<!-- 指定Hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop/tmp</value>
</property>
</configuration>
3.2.3 hdfs-site.xml
xml复制<configuration>
<!-- 指定HDFS副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定SecondaryNameNode地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node1:50090</value>
</property>
</configuration>
3.2.4 mapred-site.xml
bash复制cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
添加以下内容:
xml复制<configuration>
<!-- 指定MapReduce运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.2.5 yarn-site.xml
xml复制<configuration>
<!-- 指定ResourceManager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<!-- NodeManager上运行的附属服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
3.2.6 workers文件
bash复制vim workers
内容修改为:
code复制node1
node2
node3
注意:Hadoop 3.x版本中,slaves文件已更名为workers文件
4. 集群分发与启动
4.1 配置文件分发
将主节点(node1)上的配置分发到其他节点:
bash复制# 分发环境变量配置
scp /etc/profile node2:/etc/
scp /etc/profile node3:/etc/
# 分发Hadoop和JDK
scp -r /export/ node2:/
scp -r /export/ node3:/
# 在其他节点上使配置生效
ssh node2 "source /etc/profile"
ssh node3 "source /etc/profile"
4.2 集群初始化
在首次启动HDFS前,需要在NameNode上执行格式化:
bash复制hdfs namenode -format
警告:格式化操作会清除所有HDFS数据,仅在第一次启动时执行!
4.3 集群启动
4.3.1 关闭防火墙
在所有节点上执行:
bash复制systemctl stop firewalld
systemctl disable firewalld
4.3.2 启动HDFS
在主节点(node1)上执行:
bash复制start-dfs.sh
4.3.3 启动YARN
在主节点(node1)上执行:
bash复制start-yarn.sh
4.3.4 解决权限问题
如果遇到类似以下错误:
code复制ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined.
需要在/etc/profile中添加以下环境变量:
bash复制export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
然后执行source /etc/profile使配置生效。
5. 集群验证与管理
5.1 Web界面验证
Hadoop集群启动后,可以通过Web界面查看集群状态:
- HDFS管理界面:http://node1:9870
- YARN管理界面:http://node1:8088
5.2 常用管理命令
bash复制# 查看HDFS文件系统
hdfs dfs -ls /
# 查看YARN上运行的应用
yarn application -list
# 停止集群
stop-yarn.sh
stop-dfs.sh
# 单独启动/停止组件
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
yarn-daemon.sh start|stop resourcemanager|nodemanager
5.3 常见问题排查
-
节点无法启动:
- 检查各节点间网络连通性
- 检查SSH免密登录是否配置正确
- 查看对应节点的日志文件(位于$HADOOP_HOME/logs/)
-
Web界面无法访问:
- 检查防火墙是否已关闭
- 检查对应服务是否正常运行
- 检查端口是否被占用
-
磁盘空间不足:
- 定期清理HDFS垃圾箱:
hdfs dfs -expunge - 调整HDFS副本数(默认3副本)
- 定期清理HDFS垃圾箱:
6. 集群优化建议
6.1 性能调优参数
在hdfs-site.xml中添加:
xml复制<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>30</value>
</property>
在yarn-site.xml中添加:
xml复制<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
6.2 安全配置
- 配置Hadoop用户组和权限
- 启用Kerberos认证(生产环境推荐)
- 配置HDFS目录权限:
bash复制hdfs dfs -chmod -R 750 /user
6.3 监控方案
- 使用Ambari或Cloudera Manager进行集群监控
- 配置Ganglia或Prometheus+Granfa监控系统资源
- 设置关键指标告警(如磁盘使用率、节点存活状态等)
在实际生产环境中,我通常会为每个Hadoop集群建立详细的文档,记录所有配置参数变更和性能调优过程。这不仅能帮助快速排查问题,也为后续集群扩容提供参考依据。