HDSF核心-HDFS高级

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 两个命名空间的总和了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据开发工程师-宋权

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值