一、基本介绍
1、安全模式
文件系统只接受读数据请求,而不接受删除、修改等变更请求
2、 二、进入安全模式场景
1、NameNode在加载镜像文件和编辑日志期间处于安全模式(就是启动集群的时候
);
2、NameNode再接收DataNode注册时,处于安全模式
3、退出安全模式条件
hdfs-default.xml
dfs.namenode.safemode.min.datanodes
:最小可用datanode数量,默认0
dfs.namenode.safemode.threshold-pct
:副本数达到最小要求的block占系统总block数的百分比,默认0.999f。(只允许丢一个块)
dfs.namenode.safemode.extension
:稳定时间,默认值30000毫秒,即30秒
4、常用命令
bash
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
二、案例
1、磁盘修复案例
模拟数据块损坏
删除三个磁盘上的同一份文件的数据块
bash
rm -rf blk_1073741825 blk_1073741825_1001.meta blk_1073741845 blk_1073741845_1021.meta
重启集群
bash
myhadoop stop
myhadoop start
查看页面
总共23个数据库,现在就21个,所以,进入安全模式 。
处理办法
1、临时处理
使用命令退出安全模式
bash
hdfs dfsadmin -safemode get
hdfs dfsadmin -safemode leave
查看页面
安全模式已经关闭,但是,页面顶部出现了其他告警信息
现在,可以从页面进行删除数据了。
但是,下次启动,还是会进入安全模式。
2、彻底解决
找专业团队,进行数据修复,但是,一般这种方法是针对非常重要的数据进行,因为要花钱。
另外一个办法
就是根据提示信息,把元数据删除。
再次重启,就不会停留在安全模式了。
2、利用安全模式等待执行
应用场景:
有些公司,会在月底进行一些订单核算业务。
这个时候,不允许有人操作集群。
那么,我们可以使用命令,进入安全模式即可。
但是,同时我们还有其他业务脚本需要执行,怎么办?
无需人员等待
我们,写一个阻塞脚本,当退出安全模式的时候,即刻执行脚本。
查看安全模式,并进入安全模式
bash
hdfs dfsadmin -safemode get
hdfs dfsadmin -safemode enter
测试脚本
等待安全模式退出时,上传一份文件到集群
bash
#!/bin/bash
hdfs dfsadmin -safemode wait
hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /
执行脚本
脚本进入堵塞状态
退出安全模式,观察脚本情况
会发现,安全模式退出时,立即执行脚本逻辑。
bash
hdfs dfsadmin -safemode leave