栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

HDSF核心-HDFS高级

HDSF核心-HDFS高级

HDFS 的回收站 我们 windows 系统里面有一个回收站,当想恢复删除的文件的话就可以到这里面进行恢复, HDFS 也有回 收站。 HDFS 会为每一个用户创建一个回收站目录: /user/ 用户名 /.Trash/ ,每一个被用户在 Shell 命令行删除的 文件/ 目录,会进入到对应的回收站目录中,在回收站中的数据都有一个生存周期,也就是当回收站中的 文件/ 目录在一段时间之内没有被用户恢复的话, HDFS 就会自动的把这个文件 / 目录彻底删除,之后,用 户就永远也找不回这个文件/ 目录了。 默认情况下 hdfs 的回收站是没有开启的,需要通过一个配置来开启,在 core-site.xml 中添加如下配置, value的单位是分钟, 1440 分钟表示是一天的生存周期 fs.trash.interval 1440 在修改配置信息之前先验证一下删除操作,显示的是直接删除掉了。 [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 fs.defaultFS hdfs://bigdata01:9000 hadoop.tmp.dir /data/hadoop_repo fs.trash.interval 1440 [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 # mycluster 是集群的逻辑名称,需要和 hdfs-site.xml 中 dfs.nameservices 值一致 fs.defaultFS hdfs://mycluster hadoop.tmp.dir /data/hadoop_repo # 用户角色配置,不配置此项会导致 web 页面报错 hadoop.http.staticuser.user root # zookeeper 集群地址 ha.zookeeper.quorum bigdata01:2181,bigdata02:2181,bigdata03:2181 修改 hdfs-site.xml 文件 [root@bigdata01 hadoop]# vi hdfs-site.xml dfs.replication 2 # 自定义的集群名称 dfs.nameservices mycluster # 所有的 namenode 列表,逻辑名称,不是 namenode 所在的主机名 dfs.ha.namenodes.mycluster nn1,nn2 # namenode 之间用于 RPC 通信的地址, value 填写 namenode 所在的主机地址 # 默认端口 8020 ,注意 mycluster 与 nn1 要和前面的配置一致 dfs.namenode.rpc-address.mycluster.nn1 bigdata01:8020 dfs.namenode.rpc-address.mycluster.nn2 bigdata02:8020 # namenode 的 web 访问地址,默认端口 9870 dfs.namenode.http-address.mycluster.nn1 bigdata01:9870 dfs.namenode.http-address.mycluster.nn2 bigdata02:9870 # journalnode 主机地址,最少三台,默认端口 8485 dfs.namenode.shared.edits.dir qjournal://bigdata01:8485;bigdata02:8485;bigdata03:8485/myclust # 故障时自动切换的实现类 dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverPr # 故障时相互操作方式 (namenode 要切换 active 和 standby) ,使用 ssh 方式 dfs.ha.fencing.methods sshfence # 修改为自己用户的 ssh key 存放地址 dfs.ha.fencing.ssh.private-key-files /root/.ssh/id_rsa # namenode 日志文件输出路径,即 journalnode 读取变更的位置 dfs.journalnode.edits.dir /data/hadoop_repo/journalnode # 启用自动故障转移 dfs.ha.automatic-failover.enabled true 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: 然后启动此 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: 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: 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 两个命名空间的总和了。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/326985.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号