1. 项目概述
在当今大数据处理领域,Hadoop作为分布式系统基础架构的核心组件,其高可用集群部署一直是企业级应用的关键需求。Rocky Linux 9.4作为RHEL兼容的稳定发行版,为Hadoop集群提供了可靠的操作系统基础。本文将详细记录在Rocky Linux 9.4系统上部署Hadoop 3.4.2高可用集群的全过程。
高可用集群部署不同于单节点或普通集群,它需要额外考虑NameNode的故障转移、JournalNode的日志同步以及ZooKeeper的协调服务。这种架构能够确保在单个节点故障时,整个集群仍能持续提供服务,对于生产环境至关重要。
2. 环境准备
2.1 硬件配置建议
对于Hadoop高可用集群,建议至少准备5台物理机或虚拟机:
- 2台作为NameNode(主备节点)
- 3台作为JournalNode(日志节点)
- 多台作为DataNode(数据节点,数量根据数据量决定)
每台机器的最低配置建议:
- CPU:4核以上
- 内存:8GB以上(NameNode建议16GB)
- 磁盘:50GB以上系统盘,数据盘根据存储需求配置
- 网络:千兆以太网
提示:生产环境中,JournalNode应该分布在不同的物理机上以确保高可用性。
2.2 操作系统配置
在所有节点上执行以下Rocky Linux 9.4基础配置:
- 更新系统:
sudo dnf update -y- 安装必要工具:
sudo dnf install -y wget curl tar openssl java-11-openjdk-devel- 配置主机名和hosts文件:
sudo hostnamectl set-hostname nn1 # 根据实际节点角色修改 echo "192.168.1.101 nn1 192.168.1.102 nn2 192.168.1.103 jn1 192.168.1.104 jn2 192.168.1.105 jn3" | sudo tee -a /etc/hosts- 关闭防火墙或配置适当规则:
sudo systemctl stop firewalld sudo systemctl disable firewalld- 配置SSH免密登录:
ssh-keygen -t rsa ssh-copy-id nn1 # 在所有节点间互相配置 ssh-copy-id nn2 ssh-copy-id jn1 ...3. Hadoop高可用集群部署
3.1 组件下载与安装
- 下载Hadoop 3.4.2:
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.4.2/hadoop-3.4.2.tar.gz tar -xzf hadoop-3.4.2.tar.gz -C /opt sudo ln -s /opt/hadoop-3.4.2 /opt/hadoop- 下载ZooKeeper 3.8.3(用于故障转移):
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz tar -xzf apache-zookeeper-3.8.3-bin.tar.gz -C /opt sudo ln -s /opt/apache-zookeeper-3.8.3-bin /opt/zookeeper3.2 核心配置文件修改
- Hadoop环境变量配置(/opt/hadoop/etc/hadoop/hadoop-env.sh):
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export HADOOP_HOME=/opt/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop- 核心配置文件(/opt/hadoop/etc/hadoop/core-site.xml):
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>nn1:2181,nn2:2181,jn1:2181</value> </property> </configuration>- HDFS配置文件(/opt/hadoop/etc/hadoop/hdfs-site.xml):
<configuration> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>nn1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>nn2:8020</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/var/data/hadoop/journal</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> </configuration>3.3 ZooKeeper配置
- 基本配置(/opt/zookeeper/conf/zoo.cfg):
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/var/lib/zookeeper clientPort=2181 server.1=nn1:2888:3888 server.2=nn2:2888:3888 server.3=jn1:2888:3888- 在每个ZooKeeper节点上创建myid文件:
# 在nn1上 echo "1" | sudo tee /var/lib/zookeeper/myid # 在nn2上 echo "2" | sudo tee /var/lib/zookeeper/myid # 在jn1上 echo "3" | sudo tee /var/lib/zookeeper/myid4. 集群启动与验证
4.1 启动顺序
- 首先启动所有JournalNode:
/opt/hadoop/bin/hdfs --daemon start journalnode- 启动ZooKeeper集群(在所有配置的ZooKeeper节点上):
/opt/zookeeper/bin/zkServer.sh start- 格式化并启动第一个NameNode:
# 在nn1上执行 hdfs namenode -format hdfs zkfc -formatZK /opt/hadoop/sbin/hadoop-daemon.sh start namenode- 在第二个NameNode上同步元数据并启动:
# 在nn2上执行 hdfs namenode -bootstrapStandby /opt/hadoop/sbin/hadoop-daemon.sh start namenode- 启动所有DataNode:
/opt/hadoop/sbin/hadoop-daemon.sh start datanode- 启动ZKFC(故障转移控制器):
/opt/hadoop/sbin/hadoop-daemon.sh start zkfc4.2 集群验证
- 检查NameNode状态:
hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2- 检查集群健康状态:
hdfs dfsadmin -report- 测试故障转移(在active NameNode上停止服务):
/opt/hadoop/sbin/hadoop-daemon.sh stop namenode # 观察备用NameNode是否自动接管5. 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| JournalNode启动失败 | 端口冲突或目录权限问题 | 检查8485端口是否被占用,确保/var/data/hadoop/journal目录存在且有写权限 |
| NameNode无法成为active状态 | ZooKeeper连接问题 | 检查ZooKeeper服务是否正常运行,确认ha.zookeeper.quorum配置正确 |
| DataNode无法连接NameNode | 网络配置或防火墙问题 | 检查网络连通性,确认所有节点/etc/hosts配置一致,关闭防火墙 |
| 故障转移不成功 | sshfence配置问题 | 确保SSH免密登录配置正确,检查dfs.ha.fencing.ssh.private-key-files路径 |
6. 性能调优建议
- 内存配置调整(/opt/hadoop/etc/hadoop/hadoop-env.sh):
export HADOOP_HEAPSIZE_MAX=4096m # 根据机器内存调整 export HADOOP_NAMENODE_OPTS="-Xmx4g -Xms4g" export HADOOP_DATANODE_OPTS="-Xmx2g -Xms2g"- HDFS块大小调整(hdfs-site.xml):
<property> <name>dfs.blocksize</name> <value>256m</value> <!-- 根据实际数据特点调整 --> </property>- 副本数量配置:
<property> <name>dfs.replication</name> <value>3</value> <!-- 生产环境建议至少3副本 --> </property>- 启用短路本地读取(提升性能):
<property> <name>dfs.client.read.shortcircuit</name> <value>true</value> </property>7. 监控与维护
- 配置Hadoop内置的监控指标输出:
<!-- 在hdfs-site.xml中添加 --> <property> <name>dfs.namenode.metrics.logger.period.seconds</name> <value>60</value> </property>- 使用Linux系统工具监控:
top -H -p $(pgrep -f NameNode) # 监控NameNode线程 iotop -o # 监控磁盘IO iftop -i eth0 # 监控网络流量- 定期维护命令:
# 检查HDFS文件系统 hdfs fsck / -files -blocks -locations # 平衡数据分布 hdfs balancer -threshold 10重要提示:生产环境中建议配置额外的监控系统如Prometheus+Grafana来全面监控集群状态。
8. 安全加固措施
- 启用HDFS权限检查:
<property> <name>dfs.permissions.enabled</name> <value>true</value> </property>- 配置网络加密:
<property> <name>hadoop.rpc.protection</name> <value>privacy</value> </property>- 启用审计日志:
<property> <name>dfs.namenode.audit.loggers</name> <value>default</value> </property>- 定期备份NameNode元数据:
# 在active NameNode上执行 hdfs dfsadmin -fetchImage /backup/nn_image9. 实际部署经验分享
- 磁盘分区建议:
- 系统盘:50GB (/)
- 数据盘:单独挂载到/var/data/hadoop
- 日志盘:单独挂载到/var/log/hadoop
- 系统参数调优:
# 增加文件描述符限制 echo "hadoop - nofile 65536" | sudo tee /etc/security/limits.d/hadoop.conf # 调整内核参数 echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf echo "net.ipv4.tcp_keepalive_time = 600" | sudo tee -a /etc/sysctl.conf sudo sysctl -p- 部署后检查清单:
- [ ] 所有服务启动无报错
- [ ] NameNode主备状态正确
- [ ] 所有DataNode正常注册
- [ ] 能够创建和读取文件
- [ ] 故障转移测试成功
- [ ] 监控系统正常采集指标
- 升级注意事项:
- 先升级备NameNode,测试无误后再切换升级主NameNode
- JournalNode集群需要保持多数节点在线
- 建议在低峰期进行升级操作
- 提前备份关键数据和配置文件