HDFS
的回收站
我们
windows
系统里面有一个回收站,当想恢复删除的文件的话就可以到这里面进行恢复,
HDFS
也有回
收站。
HDFS
会为每一个用户创建一个回收站目录:
/user/
用户名
/.Trash/
,每一个被用户在
Shell
命令行删除的 文件/
目录,会进入到对应的回收站目录中,在回收站中的数据都有一个生存周期,也就是当回收站中的 文件/
目录在一段时间之内没有被用户恢复的话,
HDFS
就会自动的把这个文件
/
目录彻底删除,之后,用 户就永远也找不回这个文件/
目录了。
默认情况下
hdfs
的回收站是没有开启的,需要通过一个配置来开启,在
core-site.xml
中添加如下配置, value的单位是分钟,
1440
分钟表示是一天的生存周期
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
在修改配置信息之前先验证一下删除操作,显示的是直接删除掉了。
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -rm -r /NOTICE.txt
Deleted /NOTICE.txt
修改回收站配置,先在
bigdata01
上操作,然后再同步到其它两个节点,先停止集群
[root@bigdata01 hadoop-3.2.0]# sbin/stop-all.sh
[root@bigdata01 hadoop-3.2.0]# vi etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop_repo</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
</configuration>
[root@bigdata01 hadoop-3.2.0]# scp -rq etc/hadoop/core-site.xml bigdata02:/dat
[root@bigdata01 hadoop-3.2.0]# scp -rq etc/hadoop/core-site.xml bigdata03:/dat
[root@bigdata01 hadoop-3.2.0]# sbin/start-all.sh
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -rm -r /README.txt
2020-04-09 11:43:47,664 INFO fs.TrashPolicyDefault: Moved: 'hdfs://bigdata01:
此时看到提示信息说把删除的文件移到到了指定目录中,其实就是移动到了当前用户的回收站目录。
回收站的文件也是可以下载到本地的。其实在这回收站只是一个具备了特殊含义的
HDFS
目录。
注意:如果删除的文件过大,超过回收站大小的话会提示删除失败
需要指定参数
-skipTrash
,指定这个参数表示删除的文件不会进回收站
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -rm -r -skipTrash /user.txt
Deleted /user.txt
HDFS
的安全模式
大家在平时操作
HDFS
的时候,有时候可能会遇到这个问题,特别是刚启动集群的时候去上传或者删除文
件,会发现报错,提示
NameNode
处于
safe mode
。
这个属于
HDFS
的安全模式,因为在集群每次重新启动的时候,
HDFS
都会检查集群中文件信息是否完
整,例如副本是否缺少之类的信息,所以这个时间段内是不允许对集群有修改操作的,如果遇到了这个情
况,可以稍微等一会,等
HDFS
自检完毕,就会自动退出安全模式。
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -rm -r /hadoop-3.2.0.tar.gz
2020-04-09 12:00:36,646 WARN fs.TrashPolicyDefault: Can't create trash direct
org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create direct
此时访问
HDFS
的
web ui
界面,可以看到下面信息,
on
表示处于安全模式,
offff
表示安全模式已结束
或者通过hdfs命令也可以查看当前的状态
[root@bigdata01 hadoop-3.2.0]# hdfs dfsadmin -safemode get
Safe mode is ON
如果想快速离开安全模式,可以通过命令强制离开,正常情况下建议等
HDFS
自检完毕,自动退出
[root@bigdata01 hadoop-3.2.0]# hdfs dfsadmin -safemode leave
Safe mode is OFF
此时,再操作
HDFS
中的文件就可以了。
实战:定时上传数据至
HDFS
需求分析:
在实际工作中会有定时上传数据到
HDFS
的需求,我们有一个
web
项目每天都会产生日志文件,日
志文件的格式为
access_2020_01_01.log
这种格式的,每天产生一个,我们需要每天凌晨将昨天生
成的日志文件上传至
HDFS
上,按天分目录存储,
HDFS
上的目录格式为
20200101
针对这个需求,我们需要开发一个
shell
脚本,方便定时调度执行
第一步:我们需要获取到昨天日志文件的名称
第二步:在
HDFS
上面使用昨天的日期创建目录
第三步:将昨天的日志文件上传到刚创建的
HDFS
目录中
第四步:要考虑到脚本重跑,补数据的情况
第五步:配置
crontab
任务
开始开发
shell
脚本,脚本内容如下:
[root@bigdata01 ~]# mkdir -p /data/shell
[root@bigdata01 ~]# cd /data/shell
[root@bigdata01 shell]# vi uploadLogData.sh
#!/bin/bash
#
获取昨天日期字符串
yesterday=$1
if [ "$yesterday" = "" ]
then
yesterday=`date +%Y_%m_%d --date="1 days ago"`
fi
#
拼接日志文件路径信息
logPath=/data/log/access_${yesterday}.log
#
将日期字符串中的
_
去掉
hdfsPath=/log/${yesterday//_/}
#
在
hdfs
上创建目录
hdfs dfs -mkdir -p ${hdfsPath}
#
将数据上传到
hdfs
的指定目录中
hdfs dfs -put ${logPath} ${hdfsPath}
生成测试数据,注意,文件名称中的日期根据昨天的日期命名
[root@bigdata01 shell]# mkdir -p /data/log
[root@bigdata01 shell]# cd /data/log
[root@bigdata01 log]# vi access_2020_04_08.log
log1
执行脚本
[root@bigdata01 log]# cd /data/shell/
[root@bigdata01 shell]# sh -x uploadLogData.sh
+ yesterday=
+ '[' '' = '' ']'
++ date +%Y_%m_%d '--date=1 days ago'
+ yesterday=2020_04_08
+ logPath=/data/log/access_2020_04_08.log
+ hdfsPath=/log/20200408
+ hdfs dfs -mkdir -p /log/20200408
+ hdfs dfs -put /data/log/access_2020_04_08.log /log/20200408
[root@bigdata01 shell]# hdfs dfs -ls /log/20200408
Found 1 items
-rw-r--r-- 2 root supergroup 15 2020-04-09 16:05 /log/20200408/acce
注意:如果想要指定日期上传数据,可以通过在脚本后面传递参数实现
先创建一个日期的测试数据
[root@bigdata01 shell]# cd /data/log/
[root@bigdata01 log]# cp access_2020_04_08.log access_2020_01_01.log
执行脚本
[root@bigdata01 log]# cd /data/shell/
[root@bigdata01 shell]# sh -x uploadLogData.sh 2020_01_01
+ yesterday=2020_01_01
+ '[' 2020_01_01 = '' ']'
+ logPath=/data/log/access_2020_01_01.log
+ hdfsPath=/log/20200101
+ hdfs dfs -mkdir -p /log/20200101
+ hdfs dfs -put /data/log/access_2020_01_01.log /log/20200101
[root@bigdata01 shell]# hdfs dfs -ls /log/20200101
Found 1 items
-rw-r--r-- 2 root supergroup 15 2020-04-09 16:17 /log/20200101/acce
这样后期如果遇到某天的数据漏传了,或者需要重新上传,就可以通过手工指定日期实现上传操作,在实
际工作中这种操作是不可避免的,所以我们在开发脚本的时候就直接考虑好补数据的情况,别等需要用的
时候了再去增加这个功能。
最后配置
crontab
定时任务,每天凌晨
1
点执行
[root@bigdata01 shell]# vi /etc/crontab
0 1 * * * root sh /data/shell/uploadLogData.sh >> /data/shell/uploadLogData.l
HDFS
的高可用和高扩展
我们前面分析了
NameNode
负责接收用户的操作请求,所有的读写请求都会经过它,如果它挂了怎么
办?
这个时候集群是不是就无法正常提供服务了?是的,那现在我们这个集群就太不稳定了,因为
NameNode
只有一个,是存在单点故障的,咱们在现实生活中,例如,县长,是有正的和副的,这样就 是为了解决当正县长遇到出差的时候,副县长可以顶上去。
所以在
HDFS
的设计中,
NameNode
也是可以支持多个的,一个主的 多个备用的,,当主的挂掉了,备 用的可以顶上去,这样就可以解决NameNode
节点宕机导致的单点故障问题了,也就实现了
HDFS
的高可 用还有一个问题是,前面我们说了NameNode
节点的内存是有限的,只能存储有限的文件个数,那使用一 个主NameNode
,多个备用的
NameNode
能解决这个问题吗?
不能! 一个主NameNode
,多个备用的
NameNode
的方案只能解决
NameNode
的单点故障问题,无法解决单个 NameNode内存不够用的问题,那怎么办呢?不用担心,官方提供了
Federation
机制,可以翻译为联 邦,它可以解决单节点内存不够用的情况,具体实现思路我们稍后分析,这个就是HDFS
的高扩展
(联邦机制主要解决内存不足问题,主备主要管防止节点挂掉,主备之间进行选举,得到Active状态的主节点,备用节点进行备份,防止主节点挂掉自己顶上来)
HDFS
的高可用
(HA)
下面我们首先来看一下
HDFS
的高可用,也可以称之为
HA(High Available)
HDFS的HA
,指的是在一个集群中存在多个
NameNode
,分别运行在独立的物理节点上。在任何时间 点,只有一个NameNode
是处于
Active
状态,其它的是处于
Standby
状态。
Active NameNode
(简写为 Active NN)负责所有的客户端的操作,而
Standby NameNode
(简写为
Standby NN
)用来同步
Active NameNode的状态信息,以提供快速的故障恢复能力。
为了保证
Active NN
与
Standby NN
节点状态同步,即元数据保持一致。除了
DataNode
需要向这些
NameNode
发送
block
位置信息外,还构建了一组独立的守护进程
”JournalNodes”
(简写为
JN
)
,
用来同 步Edits
信息。当
Active NN
执行任何有关命名空间的修改,它需要持久化到一半以上的
JNs
上。而 Standby NN负责观察
JNs
的变化,读取从
Active NN
发送过来的
Edits
信息,并更新自己内部的命名空间。 一旦Active NN
遇到错误,
Standby NN
需要保证从
JNs
中读出了全部的
Edits
,然后切换成
Active
状态,如 果有多个Standby NN
,还会涉及到选主的操作,选择一个切换为
Active
状态。
需要注意一点,为了保证
Active NN
与
Standby NN
节点状态同步,即元数据保持一致
这里的元数据包含两块,一个是静态的,一个是动态的
静态的是
fsimage
和
edits
,其实
fsimage
是由
edits
文件合并生成的,所以只需要保证
edits
文件内容的一
致性。这个就是需要保证多个
NameNode
中
edits
文件内容的事务性同步。这块的工作是由
JournalNodes
集群进行同步的
动态数据是指
block
和
DataNode
节点的信息,这个如何保证呢?
当
DataNode
启动的时候,上报数据信息的时候需要向每个
NameNode
都上报一份。
这样就可以保证多个
NameNode
的元数据信息都一样了,当一个
NameNode down
掉以后,立刻从
Standby NN
中选择一个进行接管,没有影响,因为每个
NameNode
的元数据时刻都是同步的。
注意
:
使用
HA
的时候,不能启动
SecondaryNameNode
,会出错。
之前是
SecondaryNameNode
负责合并
edits
到
fsimage
文件 那么现在这个工作被
standby NN
负
责了。
NameNode
切换可以自动切换,也可以手工切换,如果想要实现自动切换,需要使用到
zookeeper
集 群。
使用
zookeeper
集群自动切换的原理是这样的
当多个
NameNode
启动的时候会向
zookeeper
中注册一个临时节点,当
NameNode
挂掉的时候,这个临 时节点也就消失了,这属于zookeeper
的特性,这个时候,
zookeeper
就会有一个
watcher
监视器监视 到,就知道这个节点down
掉了,然后会选择一个节点转为
Active
,把
down
掉的节点转为
Standby
。
注意:下面的配置步骤建议大家有空闲时间了再来操作就行,作为一个课外扩展,因为在工作中这个配置 是不需要我们做的,我们只需要知道这种特性即可。
下面开始配置
HDFS
的
HA
HA
集群规划
解释:针对
HDFS
的
HA
集群,在这里我们只需要启动
HDFS
相关的进程即可,
YARN
相关的进程可以不启
动,它们两个的进程本来就是相互独立的。
在
HDFS
的
HA
集群中,就不需要启动
SecondaryNameNode
进程了
namenode
:
hdfs
的主节点
datanode
:
hdfs
的从节点
journalnode
:
JournalNode
进程,用来同步
Edits
信息的
zkfc(DFSZKFailoverController)
:监视
namenode
的状态,负责切换
namenode
节点的状态
zookeeper(QuorumPeerMain)
:保存
ha
集群的节点状态信息
环境准备:三个节点
bigdata01 192.168.182.100
bigdata02 192.168.182.101
bigdata03 192.168.182.102
每个节点的基础环境都要先配置好,先把
ip
、
hostname
、
fifirewalld
、
ssh
免密码登录、
host
、免密码登 录,JDK
这些基础环境配置好 我们目前使用的这几台机器之前已经搭建过分布式集群,所以这些基础环境都是没有问题的
但是注意:有一点还需要完善一下,由于
namenode
在进行故障切换的时候,需要在两个
namenode
节点之间互相使用
ssh
进行连接,所以需要实现这两个
namenode
之间的互相免密码登
录,目前我们只实现了
bigdata01
免密码登录到
bigdata02
,所以还需要实现
bigdata02
免密码登
录到
bigdata01
,这一步如果不做,后期无法实现
namenode
故障自动转移。
[root@bigdata02 hadoop]# scp ~/.ssh/authorized_keys bigdata01:~/
root@bigdata01's password:
输入密码
authorized_keys 100% 792 456.2KB/s 00:00
[root@bigdata01 hadoop]# cat ~/authorized_keys >> ~/.ssh/authorized_keys
然后验证一下
bigdata02
是否可以免密码登录
bigdata01
,只要可以不输入密码就能连接进去就说明免密
码登录搞定了。
[root@bigdata02 hadoop]# ssh bigdata01
Last login: Fri Feb 6 23:54:41 2026 from 192.168.182.1
接着把
bigdata01
、
bigdata02
、
bigdata03
中之前安装的
hadoop
删掉,删除解压的目录,以及
hadoop_repo
目录。
注意:我们需要把
bigdata01
、
bigdata02
、
bigdata03
节点中
/data
目录下的
hadoop_repo
目录
和
/data/soft
下的
hadoop-3.2.0
目录删掉,恢复这些节点的环境,这里面记录的有之前集群的一些
信息。
[root@bigdata01 ~]# rm -rf /data/soft/hadoop-3.2.0
[root@bigdata01 ~]# rm -rf /data/hadoop_repo
[root@bigdata02~]# rm -rf /data/soft/hadoop-3.2.0
[root@bigdata02 ~]# rm -rf /data/hadoop_repo
[root@bigdata03 ~]# rm -rf /data/soft/hadoop-3.2.0
[root@bigdata04 ~]# rm -rf /data/hadoop_repo
我们在这里需要使用到
zookeeper
这个组件,所以先把它安装起来。
bigdata01
bigdata02
bigdata03
2.
首先在
bigdata01
节点上配置
zookeeper
解压
[root@bigdata01 soft]# tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
修改配置
dataDir=/data/soft/apache-zookeeper-3.5.8-bin/data
server.0=bigdata01:2888:3888
server.1=bigdata02:2888:3888
server.2=bigdata03:2888:3888
创建目录保存
myid
文件,并且向
myid
文件中写入内容
myid
中的值其实是和
zoo.cfg
中
server
后面指定的编号是一一对应的
编号
0
对应的是
bigdata01
这台机器,所以在这里指定
0
在这里使用
echo
和 重定向 实现数据写入
[root@bigdata01 conf]#cd /data/soft/apache-zookeeper-3.5.8-bin
[root@bigdata01 apache-zookeeper-3.5.8-bin]# mkdir data
[root@bigdata01 apache-zookeeper-3.5.8-bin]# cd data
[root@bigdata01 data]# echo 0 > myid
3.
把修改好配置的
zookeeper
拷贝到其它两个节点
[root@bigdata01 soft]# scp -rq apache-zookeeper-3.5.8-bin bigdata02:/data/soft
[root@bigdata01 soft]# scp -rq apache-zookeeper-3.5.8-bin bigdata03:/data/sof
4.
修改
bigdata02
和
bigdata03
上
zookeeper
中
myid
文件的内容
首先修改
bigdata02
节点上的
myid
文件
[root@bigdata02 ~]# cd /data/soft/apache-zookeeper-3.5.8-bin/data/
[root@bigdata02 data]# echo 1 > myid
然后修改
bigdata03
节点上的
myid
文件
[root@bigdata03 data]# cd /data/soft/apache-zookeeper-3.5.8-bin/data/
[root@bigdata03 data]# echo 2 > myid
启动
zookeeper
集群
分别在
bigdata01
、
bigdata02
、
bigdata03
上启动
zookeeper
进程
在
bigdata01
上启动
[root@bigdata01 apache-zookeeper-3.5.8-bin]# bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /data/soft/apache-zookeeper-3.5.8-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
。。。。(2,3机器照做)
6.
验证
分别在
bigdata01
、
bigdata02
、
bigdata03
上执行
jps
命令验证是否有
QuorumPeerMain
进程
如果都有就说明
zookeeper
集群启动正常了
如果没有就到对应的节点的
logs
目录下查看
zookeeper*-*.out
日志文件
执行
bin/zkServer.sh status
命令会发现有一个节点显示为
leader
,其他两个节点为
follower
[root@bigdata01 apache-zookeeper-3.5.8-bin]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/soft/apache-zookeeper-3.5.8-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@bigdata02 apache-zookeeper-3.5.8-bin]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/soft/apache-zookeeper-3.5.8-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
[root@bigdata03 apache-zookeeper-3.5.8-bin]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/soft/apache-zookeeper-3.5.8-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
7.停止zookeeper集群
最后想要停止
zookeeper
集群的时候可以在
bigdata01
、
bigdata02
、
bigdata03
三台机器上分别执行
bin/zkServer.sh stop
命令即可。
接下来我们来配置
Hadoop
集群
先在
bigdata01
节点上进行配置
1.
解压
hadoop
安装包
[root@bigdata01 soft]# tar -zxvf hadoop-3.2.0.tar.gz
2.
修改
hadoop
相关配置文件
进入配置文件所在目录
[root@bigdata01 soft]# cd hadoop-3.2.0/etc/hadoop/
[root@bigdata01 hadoop]#
[root@bigdata01 hadoop]# vi hadoop-env.sh
export JAVA_HOME=/data/soft/jdk1.8
export HADOOP_LOG_DIR=/data/hadoop_repo/logs/hadoop
修改
core-site.xml
文件
[root@bigdata01 hadoop]# vi core-site.xml
<configuration>
# mycluster
是集群的逻辑名称,需要和
hdfs-site.xml
中
dfs.nameservices
值一致
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop_repo</value>
</property>
#
用户角色配置,不配置此项会导致
web
页面报错
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
# zookeeper
集群地址
<property>
<name>ha.zookeeper.quorum</name>
<value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
</property>
</configuration>
修改
hdfs-site.xml
文件
[root@bigdata01 hadoop]# vi hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
#
自定义的集群名称
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
#
所有的
namenode
列表,逻辑名称,不是
namenode
所在的主机名
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
# namenode
之间用于
RPC
通信的地址,
value
填写
namenode
所在的主机地址
#
默认端口
8020
,注意
mycluster
与
nn1
要和前面的配置一致
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>bigdata01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>bigdata02:8020</value>
</property>
# namenode
的
web
访问地址,默认端口
9870
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>bigdata01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>bigdata02:9870</value>
</property>
# journalnode
主机地址,最少三台,默认端口
8485
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata01:8485;bigdata02:8485;bigdata03:8485/myclust
</property>
#
故障时自动切换的实现类
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverPr
</property>
#
故障时相互操作方式
(namenode
要切换
active
和
standby)
,使用
ssh
方式
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
#
修改为自己用户的
ssh key
存放地址
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
# namenode
日志文件输出路径,即
journalnode
读取变更的位置
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hadoop_repo/journalnode</value>
</property>
#
启用自动故障转移
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
mapred-site.xml
和
yarn-site.xml
在这暂时就不修改了,因为我们只需要启动
hdfs
相关的服务。
修改
workers
文件,增加所有从节点的主机名,一个一行
[root@bigdata01 hadoop]# vi workers
bigdata02
bigdata03
修改启动脚本
修改
start-dfs.sh
,
stop-dfs.sh
这两个脚本文件,在文件前面增加如下内容
[root@bigdata01 hadoop]# cd /data/soft/hadoop-3.2.0/sbin
[root@bigdata01 sbin]# vi start-dfs.sh
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_ZKFC_USER=root
HDFS_JOURNALNODE_USER=root
[root@bigdata01 sbin]# vi stop-dfs.sh
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_ZKFC_USER=root
HDFS_JOURNALNODE_USER=root
start-yarn.sh
,
stop-yarn.sh
这两个脚本暂时也不需要修改了,因为不启动
YARN
相关的进程用不到。
3.
把
bigdata01
节点上将修改好配置的安装包拷贝到其他两个从节点
[root@bigdata01 sbin]# cd /data/soft/
[root@bigdata01 soft]# scp -rq hadoop-3.2.0 bigdata02:/data/soft/
[root@bigdata01 soft]# scp -rq hadoop-3.2.0 bigdata03:/data/soft/
4.
格式化
HDFS
【此步骤只需要在第一次配置
HA
集群的时候操作一次即可】
注意:此时在格式化
HDFS
之前需要先启动所有的
journalnode
[root@bigdata01 hadoop-3.2.0]# bin/hdfs --daemon start journalnode
[root@bigdata02 hadoop-3.2.0]# bin/hdfs --daemon start journalnode
[root@bigdata03 hadoop-3.2.0]# bin/hdfs --daemon start journalnode
接下来就可以对
HDFS
进行格式化了,此时在哪个
namenode
节点上操作都可以
(bigdata01
或者
bigdata02)
,在这我们使用
bigdata01
能看到
has been successfully formatted
就说明
hdfs
格式化成功了
[root@bigdata01 hadoop-3.2.0]# bin/hdfs namenode -format
....
....
2026-02-07 00:35:06,212 INFO common.Storage: Storage directory /data/hadoop_r
2026-02-07 00:35:06,311 INFO namenode.FSImageFormatProtobuf: Saving image fil
2026-02-07 00:35:06,399 INFO namenode.FSImageFormatProtobuf: Image file /data
2026-02-07 00:35:06,405 INFO namenode.NNStorageRetentionManager: Going to ret
2026-02-07 00:35:06,432 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at bigdata01/192.168.182.100
************************************************************/
然后启动此
namenode
进程
[root@bigdata01 hadoop-3.2.0]# bin/hdfs --daemon start namenode
接下来在另一个
namenode
节点
(bigdata02)
上同步信息,看到下面的信息,则说明同步成功
[root@bigdata02 hadoop-3.2.0]# bin/hdfs namenode -bootstrapStandby
....
....
=====================================================
About to bootstrap Standby ID nn2 from:
Nameservice ID: mycluster
Other Namenode ID: nn1
Other NN's HTTP address: http://bigdata01:9870
Other NN's IPC address: bigdata01/192.168.182.100:8020
Block pool ID: BP-1332041116-192.168.182.100-1770395706205
Cluster ID: CID-c12130ca-3a7d-4722-93b0-a79b0df3ed84
Layout version: -65
isUpgradeFinalized: true
=====================================================
2026-02-07 00:39:38,594 INFO common.Storage: Storage directory /data/hadoop_r
2026-02-07 00:39:38,654 INFO namenode.FSEditLog: Edit logging is async:true
2026-02-07 00:39:38,767 INFO namenode.TransferFsImage: Opening connection to
2026-02-07 00:39:38,854 INFO common.Util: Combined time for file download and
2026-02-07 00:39:38,855 INFO namenode.TransferFsImage: Downloaded file fsimag
2026-02-07 00:39:38,894 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at bigdata02/192.168.182.101
************************************************************/
5.
格式化
zookeeper
节点【此步骤只需要在第一次配置
HA
集群的时候操作一次即可】
在任意一个节点上操作都可以,在这里我使用
bigdata01
节点
能看到日志中输出
Successfully created /hadoop-ha/mycluster in ZK.
则说明操作成功
[root@bigdata01 hadoop-3.2.0]# bin/hdfs zkfc -formatZK
....
....
2026-02-07 00:42:17,212 INFO zookeeper.ClientCnxn: Socket connection establis
2026-02-07 00:42:17,220 INFO zookeeper.ClientCnxn: Session establishment comp
2026-02-07 00:42:17,244 INFO ha.ActiveStandbyElector: Successfully created /h
2026-02-07 00:42:17,249 INFO zookeeper.ZooKeeper: Session: 0x100001104b00098
2026-02-07 00:42:17,251 WARN ha.ActiveStandbyElector: Ignoring stale result f
2026-02-07 00:42:17,251 INFO zookeeper.ClientCnxn: EventThread shut down for
2026-02-07 00:42:17,254 INFO tools.DFSZKFailoverController: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down DFSZKFailoverController at bigdata01/192.168.182.
************************************************************/
6.
启动
HDFS
的
HA
集群
注意:以后启动
HDFS
的
HA
集群直接使用这里面的命令即可,不需要再执行
4
、
5
步中的操作了
在
bigdata01
上执行下面命令
[root@bigdata01 hadoop-3.2.0]# sbin/start-dfs.sh
Starting namenodes on [bigdata01 bigdata02]
Last login: Sat Feb 7 00:02:27 CST 2026 on pts/0
bigdata01: namenode is running as process 6424. Stop it first.
Starting datanodes
Last login: Sat Feb 7 00:47:13 CST 2026 on pts/0
Starting journal nodes [bigdata01 bigdata03 bigdata02]
Last login: Sat Feb 7 00:47:13 CST 2026 on pts/0
bigdata02: journalnode is running as process 4864. Stop it first.
bigdata01: journalnode is running as process 6276. Stop it first.
bigdata03: journalnode is running as process 2479. Stop it first.
Starting ZK Failover Controllers on NN hosts [bigdata01 bigdata02]
Last login: Sat Feb 7 00:47:18 CST 2026 on pts/0
7.
验证
HA
集群
此时访问两个
namenode
节点的
9870
端口,其中一个显示为
Active
,另一个显示为
Standby
此时我们来手工停掉
active
状态的
namenode
,模拟
namenode
宕机的情况,验证一下另一个
standby
的
namenode
是否可以自动切换为
active
[root@bigdata01 hadoop-3.2.0]# jps
8758 DFSZKFailoverController
8267 NameNode
1581 QuorumPeerMain
8541 JournalNode
8814 Jps
[root@bigdata01 hadoop-3.2.0]# kill 8267
[root@bigdata01 hadoop-3.2.0]# jps
8758 DFSZKFailoverController
1581 QuorumPeerMain
8541 JournalNode
8845 Jps
工停掉
active
状态的
namenode
,模拟
namenode
宕机的情况,验证一下另一个
standby
的
namenode
是否可以自动切换为
active
此时再刷新查看
bigdata02
的信息,会发现它的状态变为了
active
接着我们再把bigdata01中的namenode启动起来,会发现它的状态变为了standby
[root@bigdata01 hadoop-3.2.0]# bin/hdfs --daemon start namenode
[root@bigdata01 hadoop-3.2.0]# jps
8898 NameNode
8758 DFSZKFailoverController
8967 Jps
1581 QuorumPeerMain
8541 JournalNode
通过前面的操作可以发现,现在的
namenode
其实就解决了单点故障的问题,实现了高可用。
现在我们再操作
HDFS
的时候就应该这样操作了。
这里面的
mycluster
就是在
hdfs-site.xml
中配置的
dfs.nameservices
属性的值。
[root@bigdata02 hadoop-3.2.0]# bin/hdfs dfs -ls hdfs://mycluster/
[root@bigdata02 hadoop-3.2.0]# bin/hdfs dfs -put README.txt hdfs://mycluster/
[root@bigdata02 hadoop-3.2.0]# bin/hdfs dfs -ls hdfs://mycluster/ Found 1
-rw-r--r-- 2 root supergroup 1361 2026-02-07 00:58 hdfs://mycluster/R
停止
HDFS
的
HA
集群
[gdata01 hadoop-3.2.0]# sbin/stop-dfs.sh
Stopping namenodes on [bigdata01 bigdata02]
Last login: Sat Feb 7 00:52:01 CST 2026 on pts/0
Stopping datanodes
Last login: Sat Feb 7 01:03:23 CST 2026 on pts/0
Stopping journal nodes [bigdata01 bigdata03 bigdata02]
Last login: Sat Feb 7 01:03:25 CST 2026 on pts/0
Stopping ZK Failover Controllers on NN hosts [bigdata01 bigdata02]
Last login: Sat Feb 7 01:03:29 CST 2026 on pts/0
HDFS
的高扩展
(Federation)
HDFS Federation
可以解决单一命名空间存在的问题,使用多个
NameNode
,每个
NameNode负责一个
这种设计可提供以下特性:
1
:
HDFS
集群扩展性。多个
NameNode
分管一部分目录,使得一个集群可以扩展到更多节点,不再因内
存的限制制约文件存储数目。
2
:性能更高效。多个
NameNode
管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐
率。
3
:良好的隔离性。用户可根据需要将不同业务数据交由不同
NameNode
管理,这样不同业务之间影响很
小。
如果真用到了
Federation
,一般也会和前面我们讲的
HA
结合起来使用,来看这个图
这里面用到了
4
个
NameNode
和
6
个
DataNode
NN-1
、
NN-2
、
NN-3
、
NN-4
DN-1
、
DN-2
、
DN-3
、
DN-4
、
DN-5
、
DN-6
、
其中
NN-1
、和
NN-3
配置了
HA
,提供了一个命令空间,
/share
,其实可理解为一个顶级目录
NN-2
和
NN-4
配置了
HA
,提供了一个命名空间,
/user
这样后期我们存储数据的时候,就可以根据数据的业务类型来区分是存储到
share
目录下还是
user
目录
下,此时
HDFS
的存储能力就是
/share
和
/user
两个命名空间的总和了。