任务目的
- 了解什么是安全模式,知晓集群在安全模式下能做什么工作
- 掌握集群进入和退出安全模式的三种情况
- 掌握集群在正常冷启动时进入安全模式的原理
任务清单
- 任务1:安全模式简介
- 任务2:进入安全模式的三种情况
- 任务3:退出安全模式的三种方式
详细任务步骤
任务1:安全模式简介
问题场景:
集群启动后,可以查看目录,但是上传文件时报错,打开 Web 页面可看到 NameNode 正处于 SafeMode 状态,怎么处理?
SafeMode 是 NameNode 的一种特殊状态(Active/Standby/SafeMode 安全模式),在这种状态下,文件系统只接受读数据请求(ls、cat),而不接受上传、删除、修改等变更请求。
在 NameNode 主节点启动时,HDFS 首先进入安全模式,DataNode 在启动的时候会向 NameNode 发送心跳信号并汇报可用的 block 的状态,当整个系统达到安全标准时,HDFS 自动离开安全模式。
如果 HDFS 处于安全模式下,则文件 block 不能进行任何的副本复制操作。
任务2:进入安全模式的三种情况
1. HDFS 集群正常冷启动
在 HDFS 集群正常冷启动时, NameNode 会在 SafeMode 状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可。
在刚运行完 start-dfs.sh
命令时,50070页面显示的信息:
图1
正常冷启动时进入安全模式的原理:
NameNode 的内存元数据中,包含文件路径、副本数、blockid 及每一个 block 所在 DataNode 的信息,而 fsimage 中,不包含 block 所在的 DataNode 信息。
那么,当 NameNode 冷启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的 DataNode 信息 ——> 就会导致 NameNode 认为所有的 block 都已经丢失 ——> 从而进入安全模式 ——> 随着 DataNode 陆续启动,DataNode 定期向 NameNode 汇报自身所持有的 blockid 信息, NameNode 就会将内存元数据中的 block 所在 DataNode 信息补全更新 ——> 找到了所有 block 的位置,从而自动退出安全模式。
2. block 丢失率达到 0.1%
如果 NameNode 发现集群中的 block 丢失率达到一定比例时(0.1%), NameNode 就会进入安全模式。这个丢失率是可以手动配置的,默认是在配置文件 hdfs-default.xml 中定义了最小的副本率为 dfs.namenode.safemode.threshold-pct=0.999f。
Hadoop 中每个块默认的最小副本数为 1,由 dfs.namenode.replication.min 参数控制。
dfs.namenode.safemode.threshold-pct 参数的意思是指定应有多少比例的数据块满足最小副本数的要求。这个值小于、等于0表示无须等待就可以退出安全模式;而如果这个值大于 1 表示永远处于安全模式。如果设为 1 则 HDFS 永远是处于 SafeMode。这是因为在集群环境中,DataNode 上报的 block 个数永远无法完全达到 NameNode 节点中元数据记录的 block 个数。
3. 手动进入安全模式
效果图如下所示:
图2
可以使用如下命令查看集群是否处于安全模式中:
效果图如下所示:
图3
进入安全模式后,文件系统只接受读数据请求(ls、cat),而不接受上传、删除、修改等变更请求。
图4
任务3:退出安全模式的三种方式
(1)在 HDFS 集群正常冷启动完成后,自动退出
(2)手动退出安全模式(但是并不能真正地解决问题)
效果如下所示:
图5
(3)找到问题所在,进行相应修复
场景1:
公司现在有搭建好的 Hadoop 集群,现在想要运行 MapReduce 程序,此时发现 YARN 集群启动不成功,报 IOException 异常,异常的大致意思就是磁盘空间满了,导致程序在 HDFS 上创建文件失败!!!
让我们模拟当时的环境,遇到此问题后,首先要做的就是先查看 CentOS 系统的磁盘使用情况:
打印情况如下所示:
图6
发现磁盘使用100%,导致空间不足,从而使 Hadoop 运行程序时,需要建立临时的文件的控件都没有,所以导致程序运行失败,出现 IOException 异常。
现在为了能让程序运行成功,我们可以先手动删除几个占用空间比较大而且无关紧要的文件,一般线上挂载的磁盘都比较大,出现这样的异常情况,几率是非常小的。
删除文件后,再次运行程序,发现又报异常,看日志发现,Hadoop 由于磁盘已满,而导致集群进行了安全模式,所以再次导致程序运行失败,此时,我们只需要使用命令主动退出安全模式即可。
再次运行程序,此时正常运行。
场景2:
集群中大部分 DataNode 宕机,导致文本块丢失,进而集群进入安全模式,此时只需要修复宕机的 DataNode 即可。