4.3 HDFS 安全模式

任务目的

  • 了解什么是安全模式,知晓集群在安全模式下能做什么工作
  • 掌握集群进入和退出安全模式的三种情况
  • 掌握集群在正常冷启动时进入安全模式的原理

任务清单

  • 任务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页面显示的信息:

Vditor

图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。

<property> 
<name>dfs.namenode.replication.min</name> 
<value>1</value> 
<description>Minimal block replication. </description>
</property> 

<property> 
<name>dfs.namenode.safemode.threshold-pct</name> 
<value>0.999f</value> 
<description>
    Specifies the percentage of blocks that should satisfy the minimal
    replication requirement defined by dfs.namenode.replication.min.
    Values less than or equal to 0 mean not to wait for any particular
    percentage of blocks before exiting safemode.
    Values greater than 1 will make safe mode permanent.
</description>
</property> 

  Hadoop 中每个块默认的最小副本数为 1,由 dfs.namenode.replication.min 参数控制。

  dfs.namenode.safemode.threshold-pct 参数的意思是指定应有多少比例的数据块满足最小副本数的要求。这个值小于、等于0表示无须等待就可以退出安全模式;而如果这个值大于 1 表示永远处于安全模式。如果设为 1 则 HDFS 永远是处于 SafeMode。这是因为在集群环境中,DataNode 上报的 block 个数永远无法完全达到 NameNode 节点中元数据记录的 block 个数。

  3. 手动进入安全模式

hdfs dfsadmin -safemode enter

  效果图如下所示:

Vditor

图2

  可以使用如下命令查看集群是否处于安全模式中:

hdfs dfsadmin -safemode get

  效果图如下所示:

Vditor

图3

  进入安全模式后,文件系统只接受读数据请求(ls、cat),而不接受上传、删除、修改等变更请求。

Vditor

图4

任务3:退出安全模式的三种方式

  (1)在 HDFS 集群正常冷启动完成后,自动退出

  (2)手动退出安全模式(但是并不能真正地解决问题)

hdfs dfsadmin -safemode leave

  效果如下所示:

Vditor

图5

  (3)找到问题所在,进行相应修复

  场景1:

  公司现在有搭建好的 Hadoop 集群,现在想要运行 MapReduce 程序,此时发现 YARN 集群启动不成功,报 IOException 异常,异常的大致意思就是磁盘空间满了,导致程序在 HDFS 上创建文件失败!!!

  让我们模拟当时的环境,遇到此问题后,首先要做的就是先查看 CentOS 系统的磁盘使用情况:

df -h

  打印情况如下所示:

Vditor

图6

  发现磁盘使用100%,导致空间不足,从而使 Hadoop 运行程序时,需要建立临时的文件的控件都没有,所以导致程序运行失败,出现 IOException 异常。

  现在为了能让程序运行成功,我们可以先手动删除几个占用空间比较大而且无关紧要的文件,一般线上挂载的磁盘都比较大,出现这样的异常情况,几率是非常小的。

  删除文件后,再次运行程序,发现又报异常,看日志发现,Hadoop 由于磁盘已满,而导致集群进行了安全模式,所以再次导致程序运行失败,此时,我们只需要使用命令主动退出安全模式即可。

hdfs dfsadmin -safemode leave

  再次运行程序,此时正常运行。

  场景2:

  集群中大部分 DataNode 宕机,导致文本块丢失,进而集群进入安全模式,此时只需要修复宕机的 DataNode 即可。

猜你喜欢

转载自blog.csdn.net/c_lanxiaofang/article/details/107805340
4.3