Centos8搭建hadoop高可用集群

以下是基于 CentOS 8 搭建高可用 Hadoop 集群的完整操作流程及命令,涵盖 6 台主机的规划、部署步骤和高可用(HA)配置。结合 Hadoop 3.x 官方文档和最佳实践整理:


先决条件

  1. 硬件规划
    • 6 台 CentOS 8 主机(物理机或虚拟机),每台建议配置:
      • 4GB+ 内存,50GB+ 磁盘
      • 静态 IP(示例规划):
主机名 IP 地址 角色分配
node1 192.168.1.101 NameNode + ZKFC + JournalNode
node2 192.168.1.102 NameNode + ZKFC + JournalNode
node3 192.168.1.103 ResourceManager + JournalNode
node4 192.168.1.104 DataNode + NodeManager
node5 192.168.1.105 DataNode + NodeManager
node6 192.168.1.106 DataNode + NodeManager
  • 服务说明
    • JournalNode:存储 HA 状态(至少 3 台)
    • ZKFC(ZooKeeper Failover Controller):监控 NameNode 状态38
  1. 软件要求
    • Java JDK 1.8+(推荐 OpenJDK)
    • Hadoop 3.3.4+(官网下载
    • ZooKeeper 3.6.3+(用于 HA 仲裁)810

一、基础环境配置(所有节点执行)

1. 网络与主机名

bash

# 设置静态 IP(以 node1 为例)

sudo nmcli con mod ens33 ipv4.addresses 192.168.1.101/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8" ipv4.method manual

sudo nmcli con up ens33

# 修改主机名

sudo hostnamectl set-hostname node1

# 配置 hosts 映射(所有节点相同)

sudo vi /etc/hosts

## 添加以下内容:

192.168.1.101 node1

192.168.1.102 node2

192.168.1.103 node3

192.168.1.104 node4

192.168.1.105 node5

192.168.1.106 node6

2. 关闭防火墙与 SELinux

bash

sudo systemctl stop firewalld

sudo systemctl disable firewalld

sudo setenforce 0

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

3. 安装 JDK

bash

sudo dnf install java-1.8.0-openjdk-devel -y

echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk' | sudo tee -a /etc/profile

source /etc/profile

4. 配置 SSH 免密登录

bash

# 所有节点生成密钥

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

# 在 node1 上汇总公钥并分发

ssh-copy-id node1

ssh-copy-id node2

... # 依次操作所有节点

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

scp ~/.ssh/authorized_keys node2:~/.ssh/ # 复制到其他节点


二、Hadoop 安装与 HA 配置

1. 解压 Hadoop 到所有节点

bash

# 在 node1 操作

tar -zxvf hadoop-3.3.4.tar.gz -C /opt

sudo mv /opt/hadoop-3.3.4 /opt/hadoop

# 分发到其他节点

scp -r /opt/hadoop node2:/opt/

... # 重复至 node6

2. 配置环境变量(所有节点)

bash

echo 'export HADOOP_HOME=/opt/hadoop' | sudo tee -a /etc/profile

echo 'export PATH=PATH:HADOOP_HOME/bin:$HADOOP_HOME/sbin' | sudo tee -a /etc/profile

source /etc/profile

3. 修改 Hadoop 配置文件($HADOOP_HOME/etc/hadoop/)

  • core-site.xml - 定义全局 HA 访问点

xml

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://mycluster</value> <!-- HA 逻辑名 -->

</property>

<property>

<name>ha.zookeeper.quorum</name>

<value>node1:2181,node2:2181,node3:2181</value> <!-- ZK 集群 -->

</property>

</configuration>

  • hdfs-site.xml - 配置 HA 和 JournalNode

xml

<property>

<name>dfs.nameservices</name>

<value>mycluster</value> <!-- 与 core-site 一致 -->

</property>

<property>

<name>dfs.ha.namenodes.mycluster</name>

<value>nn1,nn2</value> <!-- 两个 NameNode ID -->

</property>

<property>

<name>dfs.namenode.rpc-address.mycluster.nn1</name>

<value>node1:8020</value>

</property>

<property>

<name>dfs.namenode.rpc-address.mycluster.nn2</name>

<value>node2:8020</value>

</property>

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value> <!-- JournalNode -->

</property>

<property>

<name>dfs.journalnode.edits.dir</name>

<value>/opt/hadoop/journal</value> <!-- JN 数据目录 -->

</property>

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>true</value> <!-- 启用自动故障转移 -->

</property>

  • workers - 指定 DataNode

plaintext

node4

node5

node6

  • yarn-site.xml - 配置 YARN HA

xml

<property>

<name>yarn.resourcemanager.ha.enabled</name>

<value>true</value>

</property>

<property>

<name>yarn.resourcemanager.cluster-id</name>

<value>yarn-cluster</value>

</property>

<property>

<name>yarn.resourcemanager.ha.rm-ids</name>

<value>rm1,rm2</value>

</property>

<property>

<name>yarn.resourcemanager.hostname.rm1</name>

<value>node3</value> <!-- RM 主节点 -->

</property>

<property>

<name>yarn.resourcemanager.hostname.rm2</name>

<value>node4</value> <!-- RM 备节点 -->

</property>


三、启动高可用集群

1. 启动 ZooKeeper(node1~node3)

bash

# 在 ZK 节点上

zkServer.sh start

2. 启动 JournalNode(node1~node3)

bash

hdfs --daemon start journalnode

3. 格式化并启动 NameNode HA

bash

# 在 node1 上格式化(首次)

hdfs namenode -format

hdfs zkfc -formatZK # 在 ZK 中初始化 HA 状态

# 启动 node1 的 NameNode

hdfs --daemon start namenode

# 在 node2 上同步元数据

hdfs namenode -bootstrapStandby

# 启动所有服务

start-dfs.sh # 启动 HDFS 集群

start-yarn.sh # 启动 YARN 集群


四、验证高可用功能

  1. 检查服务状态

bash

hdfs haadmin -getServiceState nn1 # 应返回 active

yarn rmadmin -getServiceState rm1 # 应返回 active

  1. 模拟故障转移

bash

# 手动杀死 active NameNode

kill -9 <NameNode_PID>

# 30秒内 ZKFC 应自动切换备节点为 active

hdfs haadmin -getServiceState nn2 # 验证是否变为 active

  1. Web UI 访问

五、关键运维命令

功能 命令示例
手动切换 NameNode hdfs haadmin -failover nn1 nn2
查看 JournalNode 状态 hdfs dfsadmin -report
修复数据块 hdfs fsck / -delete
添加新节点 将新主机加入 workers 并重启集群

注意

  1. 所有配置文件修改后需同步到集群所有节点(可用 scp 分发)18。
  2. 高可用下需确保 JournalNode 和 ZK 服务奇数节点存活(至少 3 台)310。
  3. 生产环境建议配置 Kerberos 认证磁盘 RAID 提升安全性。

完整操作流程参考:Hadoop 官方 HA 文档

相关推荐
我要学习别拦我~1 分钟前
kaggle分析项目:steam付费游戏数据分析
python·游戏·数据分析
大模型真好玩7 分钟前
深入浅出LangChain AI Agent智能体开发教程(四)—LangChain记忆存储与多轮对话机器人搭建
前端·人工智能·python
love530love9 分钟前
命令行创建 UV 环境及本地化实战演示—— 基于《Python 多版本与开发环境治理架构设计》的最佳实践
开发语言·人工智能·windows·python·conda·uv
都叫我大帅哥32 分钟前
深度学习的"Hello World":多层感知机全解指南
python·深度学习
麦子邪34 分钟前
C语言中奇技淫巧04-仅对指定函数启用编译优化
linux·c语言·开发语言
都叫我大帅哥37 分钟前
LangChain分层记忆解决方案:完整案例
python·langchain
小王子102442 分钟前
Django实时通信实战:WebSocket与ASGI全解析(下)
python·websocket·django
半梦半醒*1 小时前
Linux网络管理
linux·运维·网络·centos·运维开发
破刺不会编程1 小时前
linux线程概念和控制
linux·运维·服务器·开发语言·c++
alex1001 小时前
AI Agent开发学习系列 - langchain之LCEL(5):如何创建一个Agent?
人工智能·python·语言模型·langchain·prompt·向量数据库·ai agent