如何在Linux CentOS 7上配置高可用性Hadoop集群,处理海量大数据分析任务?

在企业级大数据平台构建中,高可用性(HA)Hadoop 集群 是关键架构能力,确保 Namenode 故障时集群持续可用、不丢失数据、不中断作业。A5数据在本文提供一套 实战级、技术深度强、可复现的全集成方案,包括硬件选型、操作系统配置、Hadoop HA 实现、ZooKeeper 配置、网络与安全调整、性能优化与测试评估。


一、方案背景与目标

我所在团队需要支撑 PB 级数据摄取与离线/交互式分析,要求:

  • NameNode 高可用:支持自动故障切换
  • 元数据一致性保证
  • 多 DataNode 高并发读写能力
  • 集群健康监控
  • 可扩展、稳定、易维护

选择:

  • 操作系统:CentOS 7.9
  • Hadoop 版本:3.3.5(目前稳定长线版本)
  • ZooKeeper:用于 HA 元信息协调
  • JournalNode:用于 NameNode 的共享存储日志

二、香港服务器www.a5idc.com硬件与网络配置

角色 数量 CPU 内存 磁盘 网络
NameNode 2 32 核 Intel Xeon 256 GB 2×1.2TB SSD(RAID1) 10GbE
JournalNode 3 8 核 32 GB 500GB SSD 10GbE
DataNode 10 24 核 128 GB 4×4TB HDD + 1×1TB SSD (缓存) 10GbE
ZooKeeper 3 8 核 32 GB 500GB SSD 10GbE
Edge/Gateway 2 16 核 64 GB 1TB SSD 10GbE

说明

  • SSD 主要用于元数据与 JournalLog,提升响应与 failover 速度。
  • DataNode 使用机械硬盘做 HDFS 扩容存储,中间加 SSD 缓存提升小文件/Shuffle 性能。

三、网络与基础环境准备

3.1 操作系统基础

  1. 安装 CentOS 7.9 最小版;
  2. 关闭 SELinux:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
  1. 配置时间同步:
yum install -y chrony
systemctl enable chronyd
systemctl start chronyd
  1. 统一主机名和 hosts 映射:
10.0.0.10 nn1.example.com nn1
10.0.0.11 nn2.example.com nn2
10.0.0.20 jn1.example.com jn1
10.0.0.21 jn2.example.com jn2
10.0.0.22 jn3.example.com jn3
10.0.0.30 zk1.example.com zk1
10.0.0.31 zk2.example.com zk2
10.0.0.32 zk3.example.com zk3
10.0.1.10 dn1.example.com dn1
…

四、安装 Java 与 Hadoop

4.1 安装 OpenJDK

yum install -y java-1.8.0-openjdk-devel
java -version

期望输出:

openjdk version "1.8.0_362"

4.2 下载 Hadoop

cd /opt
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz
tar -xzf hadoop-3.3.5.tar.gz
ln -s hadoop-3.3.5 hadoop

设置环境变量:

cat >> /etc/profile.d/hadoop.sh << EOF
export HADOOP_HOME=/opt/hadoop
export PATH=\$PATH:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
EOF
source /etc/profile.d/hadoop.sh

五、HDFS 高可用架构

核心思想:

  • 两个 NameNode(Active/Standby)
  • 三个 JournalNode 组成 Quorum
  • ZooKeeper Quorum 协调 failover

5.1 配置 ZooKeeper 集群

在每台 ZooKeeper 节点:

yum install -y zookeeper-server

cat > /var/lib/zookeeper/conf/zoo.cfg << EOF
tickTime=2000
dataDir=/var/lib/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=zk1.example.com:2888:3888
server.2=zk2.example.com:2888:3888
server.3=zk3.example.com:2888:3888
EOF

设置 myid:

echo "1" > /var/lib/zookeeper/data/myid  # zk1;对应 server.X

启动:

systemctl enable zookeeper-server
systemctl start zookeeper-server

5.2 配置 JournalNode

在每个 JournalNode 节点:

mkdir -p /data/jn
cat > $HADOOP_HOME/etc/hadoop/hdfs-site.xml << EOF
<property><name>dfs.journalnode.edits.dir</name><value>/data/jn</value></property>
<property><name>dfs.journalnode.rpc-address</name><value>0.0.0.0:8485</value></property>
<property><name>dfs.journalnode.http-address</name><value>0.0.0.0:8480</value></property>
EOF

启动:

$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode

5.3 编辑 HDFS 配置

hdfs-site.xml(统一推送到所有 Hadoop 节点)

<configuration>
  <!-- Common HDFS -->
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>

  <!-- HA Config -->
  <property>
    <name>dfs.nameservices</name>
    <value>cluster1</value>
  </property>

  <property>
    <name>dfs.ha.namenodes.cluster1</name>
    <value>nn1,nn2</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.cluster1.nn1</name>
    <value>nn1.example.com:8020</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.cluster1.nn2</name>
    <value>nn2.example.com:8020</value>
  </property>

  <property>
    <name>dfs.namenode.http-address.cluster1.nn1</name>
    <value>nn1.example.com:50070</value>
  </property>

  <property>
    <name>dfs.namenode.http-address.cluster1.nn2</name>
    <value>nn2.example.com:50070</value>
  </property>

  <!-- Shared Edits via JournalNodes -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://jn1.example.com:8485;jn2.example.com:8485;jn3.example.com:8485/cluster1</value>
  </property>

  <!-- Client Failover -->
  <property>
    <name>dfs.client.failover.proxy.provider.cluster1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

  <!-- ZK Failover Controller -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
  </property>
</configuration>

六、初始化 HA 环境

6.1 格式化 JournalNode

在任意 NameNode 上运行:

hdfs namenode -initializeSharedEdits

6.2 格式化 NameNode

只在 第一个 NameNode(nn1)执行:

hdfs namenode -format

6.3 启动 NameNodes 和 ZKFC

在两个 NameNode 上分别执行:

$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc

在所有 DataNode 启动 DataNode:

$HADOOP_HOME/sbin/hadoop-daemon.sh start datanode

七、验证 HA 状态

7.1 web UI

7.2 命令行状态

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

八、调优与性能提升策略

维度 参数/调优项 建议值 说明
HDFS I/O dfs.datanode.max.transfer.threads 4096 数据节点并发
Block 大小 dfs.blocksize 256MB 大文件减少 seek 开销
网络 tcp_keepalive_time 120 长链接更稳定
GC 优化 HADOOP_HEAP_OPTS -Xms8g -Xmx16g NameNode Heap 调优

hadoop-env.sh 中设置:

export HADOOP_HEAP_OPTS="-Xms8g -Xmx16g"

九、性能测试与评估

9.1 测试用例

我们使用 Hadoop 自带的 Small / Large DFSIO:

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.5-tests.jar \
  -D mapreduce.job.maps=10 \
  -D mapreduce.job.reduces=2 \
  TestDFSIO -write -nrFiles 100 -fileSize 1GB

9.2 结果记录表

测试类型 总数据量 平均写入速度 平均读取速度 耗时
SmallDFSIO 100GB 210 MB/s 225 MB/s 7m 42s
LargeDFSIO 1TB 215 MB/s 230 MB/s 1h 58m

性能衡量受网络与磁盘 I/O 限制影响。10GbE 与 SSD Journal 增强元数据性能。


十、总结与最佳实践

高可用 HA 成功搭建

  • 两个 NameNode 实现热备
  • ZooKeeper + JournalNode 无单点故障
  • 自动 Failover

🚀 性能表现

  • 大文件场景下稳定 200+ MB/s 吞吐
  • 可扩展到更大 DataNode 集群

📌 推荐最佳实践

  • 使用 SSD 做元数据、Journal
  • 监控与告警覆盖 NameNode 角色
  • 定期检查 ZooKeeper quorum 健康
posted @ 2026-01-03 11:25  A5IDC  阅读(19)  评论(0)    收藏  举报