【java】基于ZooKeeper搭建Hadoop高可用集群-2
Hadoop集群整体概述
- Hadoop集群包括两个集群:HDFS集群、YARN集群
- 两个集群逻辑上分离、通常物理上在一起
- 两个集群都是标准的主从架构集群

逻辑上分离,物理上合并的理解:
- 逻辑上分离:两个集群互相之间没有依赖、互不影响
- 物理上合并:某些角色进程往往部署在同一台物理服务器上

hadoop集群规划
hadoop集群角色规划:
| 名称 | 主机IP | 说明 |
| hadoop01 | 192.168.0.10 | namenode zkfc datanode zookeeper journalnode |
| hadoop02 | 192.168.0.11 | namenode zkfc datanode zookeeper journalnode |
| hadoop03 | 192.168.0.12 | namenode zkfc datanode zookeeper journalnode |
hadoop安装包下载:https://hadoop.apache.org/releases.html

| 目录 | 说明 |
|---|---|
| bin | Hadoop 最基本的 管理脚本 和使用脚本的目录,这些脚本是 sbin 目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用 Hadoop。 |
| etc | Hadoop 配置文件 所在的目录。 |
| include | 对外提供的编程程序头文件(具体动态库和静态库在 lib 目录中),这些头文件均是用 C++ 定义的,通常用于 C++ 程序访问 HDFS 或者编写 MapReduce 程序。 |
| lib | 该目录包含了 Hadoop 对外提供的编程动态库和静态库,与 include 目录中的头文件结合使用。 |
| libexec | 各个服务对应的 shell 脚本配置文件所在的目录,可用于配置日志输出、启动参数(比如 JVM 参数)等基本信息。 |
| sbin | Hadoop 管理脚本所在的目录,主要包含 HDFS 和 YARN 中各类服务的 启动/关闭脚本。 |
| share | Hadoop 各个模块编译后的 jar 包 所在的目录,官方自带示例。 |

zookeeper安装包:https://zookeeper.apache.org/releases.html
HADOOP集群搭建步骤
配置java、hadoop环境变量,编辑 profile 文件:
JAVA_HOME=/usr/local/java/jdk1.8.0_431
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib
export JAVA_HOME PATH CLASSPATH
export HADOOP_HOME=/root/hadoop-3.4.1
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
执行 source 命令,使得配置立即生效:
# source /etc/profile
编辑 Hadoop 配置文件
1. hadoop-env.sh:文件中设置的是 Hadoop 运行时需要的环境变量。JAVA_HOME 是必须设置的,即使我们当前的系统中设置了 JAVA_HOME,它也是不认识的,因为 Hadoop 即使是在本机上执行,它也是把当前的执行环境当成远程服务器。
export JAVA_HOME=/usr/local/java
# 设置用户以执行对应角色 shell 命令
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
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
2. core-site.xml:hadoop 的核心配置文件,有默认的配置项 core-default.xml。core-default.xml 与 core-site.xml 的功能是一样的,如果在 core-site.xml 里没有配置的属性,则会自动会获取 core-default.xml 里的相同属性的值。
<configuration>
<!-- 默认文件系统的名称。通过 URI 中 schema 区分不同文件系统。-->
<!-- file:///本地文件系统 hdfs:// hadoop分布式文件系统 gfs://。-->
<!-- hdfs 文件系统访问地址:http://nn_host:8020。-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:8020</value>
</property>
<!-- hadoop 本地数据存储目录 format 时自动生成 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/dfs/tmp</value>
</property>
<!-- 在 Web UI 访问 HDFS 使用的用户名。-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- ZooKeeper 集群的地址和端口-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
3. hdfs-site.xml
HDFS 的核心配置文件,主要配置 HDFS 相关参数,有默认的配置项 hdfs-default.xml。hdfs-default.xml 与 hdfs-site.xml 的功能是一样的,如果在 hdfs-site.xml 里没有配置的属性,则会自动会获取 hdfs-default.xml 里的相同属性的值。
<configuration>
<!--指定 hdfs 的 nameservice 为 mycluster,需要和 core-site.xml 中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- mycluster集群中有3个NameNode,分别是 nn1, nn2, nn3 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<!-- nn1 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop01:9870</value>
</property>
<!-- nn2 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop02:9870</value>
</property>
<!-- nn3 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop02:8020</value>
</property>
<!-- nn3 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop03:9870</value>
</property>
<!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
</property>
<!-- 开启 NameNode 失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定该集群出故障时,哪个实现类负责执行故障切换 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 开启短路本地读取功能 -->
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<!-- 需手动创建目录 mkdir -p /var/lib/hadoop-hdfs -->
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>
<!-- 开启黑名单 -->
<property>
<name>dfs.hosts.exclude</name>
<value>/root/hadoop-3.4.1/etc/hadoop/excludes</value>
</property>
<!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/hadoop/dfs/data/data.1, /hadoop/dfs/data/data.2, /hadoop/dfs/data/data.3</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/dfs/meta/journal</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/hadoop/dfs/meta/name</value>
</property>
</configuration>
worker 配置所有从属节点的主机名或 IP 地址,每行一个。所有从属节点上的 DataNode 服务和 NodeManager 服务都会被启动。
hadoop01
hadoop02
hadoop03
4. 创建相关数据目录:
mkdir -p /var/lib/hadoop-hdfs
mkdir -p /hadoop/dfs/data/data.1
mkdir -p /hadoop/dfs/data/data.2
mkdir -p /hadoop/dfs/data/data.3
mkdir -p /hadoop/dfs/meta/name
mkdir -p /hadoop/dfs/meta/journal
3.6 分发同步安装包
在 hadoop01 机器上将 Hadoop 安装包 scp 同步到其他机器:
[root@hadoop01 /bigdata/hadoop]# cd /bigdata/hadoop/server/
[root@hadoop01 /bigdata/hadoop/server]# scp -r hadoop-3.2.4 root@hadoop02:/bigdata/hadoop/server/
[root@hadoop01 /bigdata/hadoop/server]# scp -r hadoop-3.2.4 root@hadoop03:/bigdata/hadoop/server/
部署zookeeper 集群,并启动hadoop01、hadoop02、hadoop03的zookeeper进程
分别到三台服务器的的 ${HADOOP_HOME}/sbin 目录下,启动 journalnode 进程:
hdfs --daemon start journalnode
在 hadop001 上执行 NameNode 初始化命令:
hdfs namenode -format
NameNode format(格式化操作) 首次启动 HDFS 时,必须对其进行格式化操作。format 本质上是初始化工作,进行 HDFS 清理和准备工作。
# 仅在 hadoop01 上执行
[root@hadoop01 ~]# hdfs namenode -format
[root@hadoop01 ~]# ll /bigdata/hadoop/data/tmp/dfs/name/current/
总用量 16
-rw-r--r-- 1 root root 396 8月 31 17:04 fsimage_0000000000000000000
-rw-r--r-- 1 root root 62 8月 31 17:04 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root 2 8月 31 17:04 seen_txid
-rw-r--r-- 1 root root 218 8月 31 17:04 VERSION
在 hadoop02 上进行 namenode 元数据同步
hdfs namenode -bootstrapStandby
在任意一台 NameNode 上使用以下命令来初始化 ZooKeeper 中的 HA 状态:
hdfs zkfc -formatZK
进入到 hadoop001 的 ${HADOOP_HOME}/sbin 目录下,启动 HDFS。此时 hadoop001 和 hadoop002 上的 NameNode 服务,和三台服务器上的 DataNode 服务都会被启动:
start-dfs.sh
① hdfs集群
hdfs --daemon start namenode
hdfs --daemon start datanode
hdfs --daemon start secondarynamenode
hdfs --daemon stop namenode
hdfs --daemon stop datanode
hdfs --daemon stop secondarynamenode
② yarn集群
yarn --daemon start resourcemanager
yarn --daemon start nodemanager
yarn --daemon stop resourcemanager
yarn --daemon stop nodemanager
hdfs集群启动日志:
hadoop01节点:
[root@hadoop01 hadoop]# jps
4049 Jps
2760 NameNode
2637 DataNode
hadoop02节点:
[root@hadoop02 ~]# jps
7617 SecondaryNameNode
7427 DataNode
9011 Jps
hadoop3节点:
[root@hadoop03 ~]# jps
6358 Jps
5707 DataNode
集群信息:
[root@hadoop01 hadoop]# hdfs dfsadmin -report
Configured Capacity: 475198242816 (442.56 GB)
Present Capacity: 444044787712 (413.55 GB)
DFS Remaining: 444044697600 (413.55 GB)
DFS Used: 90112 (88 KB)
DFS Used%: 0.00%
Replicated Blocks:
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
Erasure Coded Block Groups:
Low redundancy block groups: 0
Block groups with corrupt internal blocks: 0
Missing block groups: 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
-------------------------------------------------
Live datanodes (3):
Name: 192.168.0.10:9866 (hadoop01)
Hostname: hadoop01
Decommission Status : Normal
Configured Capacity: 158399414272 (147.52 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 1884426240 (1.76 GB)
DFS Remaining: 148445114368 (138.25 GB)
DFS Used%: 0.00%
DFS Remaining%: 93.72%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sat Mar 29 03:47:46 EDT 2025
Last Block Report: Sat Mar 29 03:02:40 EDT 2025
Num of Blocks: 0
Name: 192.168.0.11:9866 (hadoop02)
Hostname: hadoop02
Decommission Status : Normal
Configured Capacity: 158399414272 (147.52 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 3091529728 (2.88 GB)
DFS Remaining: 147238014976 (137.13 GB)
DFS Used%: 0.00%
DFS Remaining%: 92.95%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sat Mar 29 03:47:46 EDT 2025
Last Block Report: Sat Mar 29 03:19:31 EDT 2025
Num of Blocks: 0
Name: 192.168.0.12:9866 (hadoop03)
Hostname: hadoop03
Decommission Status : Normal
Configured Capacity: 158399414272 (147.52 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 1967976448 (1.83 GB)
DFS Remaining: 148361568256 (138.17 GB)
DFS Used%: 0.00%
DFS Remaining%: 93.66%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sat Mar 29 03:47:46 EDT 2025
Last Block Report: Sat Mar 29 03:19:31 EDT 2025
Num of Blocks: 0
访问 HDFS 集群 UI 页面
http://192.168.0.10:9870/


浙公网安备 33010602011771号