HDFS安全模式实战篇
HDFS安全模式实战篇
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.安全模式概述
1>.什么是安全模式
安全模式是NameNode的一种状态,其中节点不接受对HDFS命名空间的任何更改,这意味着HDFS处于只读状态。NameNode在启动时自动进入安全模式,当配置的最小百分比的块满足最小复制条件时,NameNode自动离开安全模式。
NameNode可以自动进入安全模式,也可以在执行某些维护操作(例如备份HDFS元数据)之前将其置于安全模式。
2>.自动安全模式操作
当启动Namenode时,它不会立即开始向DataNode复制数据。NameNode首先自动进入称为安全模式的特殊只读操作状态。在此模式下,NameNode不接受任何更改其命名空间的请求。因此,直到它离开安全模式之前,它避免复制甚至删除任何数据块。
我们知道DataNode不断向NameNode发送两个东西:一个是心跳信息,指示它们还活着;一个是块报告,列出存储在DataNode上的所有数据块。一旦NameNode从DataNode接收到足够多的块报告,就表面它们具有该块的最小数量的副本,Hadoop就任务该数据块"安全的"被复制。
Hadoop让NameNode等待DataNode报告块信息,因此即使在尚未报告其块信息的DataNode上存在正确数量的副本,它也不会过早地开始复制数据。当预配置的百分比的块报告达到可以安全复制条件时,NameNode离开安全模式并开始向客户端提供块信息。而且它开始复制DataNode已报告为可以复制的所有块。
当NameNode重新启动时会自动进入和转换到安全模式,但有可能需要将NameNode置于安全模式。每当冻结命名空间时,需要将NameNode置于安全模式。因此,可以将安全模式看作使集群处于维护模式的工具。
温馨提示:
当NameNode处于安全模式时,不能写入HDFS数据。如果尝试执行写操作,则会出现如下图所示的错误哟~
二.将NameNode置于安全模式
有时需要执行让HDFS处于只读模式的管理操作。在此操作期间可以将NameNode显式置于安全模式。执行管理操作后,让NameNode退出安全模式。
使用dfsadmin -safemode命令管理Namenode的安全模式操作,可以使用-safemode get命令检查当前安全模式的状态,接下来就让我们实战操作一下吧。
1>.查看HDFS集群当前安全模式的状态
[root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -safemode get #查看集群当前的状态
Safe mode is OFF
[root@hadoop101.yinzhengjie.com ~]#
2>.将NameNode置于安全模式
[root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -safemode get Safe mode is OFF [root@hadoop101.yinzhengjie.com ~]# [root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -safemode enter #将HDFS集群置于安全模式状态 Safe mode is ON [root@hadoop101.yinzhengjie.com ~]# [root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -safemode get Safe mode is ON [root@hadoop101.yinzhengjie.com ~]#
3>.使NameNode离开安全模式
[root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -safemode get Safe mode is ON [root@hadoop101.yinzhengjie.com ~]# [root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -safemode leave #使NameNode离开安全模式 Safe mode is OFF [root@hadoop101.yinzhengjie.com ~]# [root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -safemode get Safe mode is OFF [root@hadoop101.yinzhengjie.com ~]#
4>.使NameNode等待恢复操作,直到HDFS退出安全模式
[root@hadoop101.yinzhengjie.com ~]# more wait.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-25 #FileName: wait.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** flag=`hdfs dfsadmin -safemode get | awk '{print $4}'` if [ "$flag" == "ON" ];then echo "###### 当前集群处于安全模式 ######" hdfs dfsadmin -safemode wait #当NameNode进入安全模式时,就等待安全模式退出后在执行下面的代码 fi echo "###### 当前集群已退出安全模式 ######" hdfs dfs -ls /yinzhengjie echo "****** 开始写入数据 ******" hdfs dfs -put /etc/fstab /yinzhengjie/ echo "****** 数据写入完成 ******" hdfs dfs -ls /yinzhengjie [root@hadoop101.yinzhengjie.com ~]#
5>.温馨提示
我们知道NameNode每次启动时自动进入安全模式。此外,当NameNode运行的服务器的磁盘空间不足时,NameNode也将进入安全模式。
NameNode将其元数据存储在使用"dfs.namenode.name.dir"参数指定的目录中。NameNode用于元数据的存储空间量取决于"dfs.datanode.du.reserved"关键参数的设置。此参数默认指定Hadoop为NameNode写入其命名空间信息二保留的可用空间的阈值。在默认情况下此参数为100MB(即1048576Bytes)
如果NameNode存储其元数据信息的服务器上的可用空间低于"dfs.datanode.du.reserved"参数指定的阈值,则NameNode会立即进入安全模式。
如果集群中大量DataNode发生故障,则Hadoop会立即将大量数据复制到集群中的其余DataNode。避免大规模数据复制的一个好方法是在安全模式下启动NameNode,然后再引导失败的DataNode。
三.NameNode如何进入安全模式
下面描述了NameNode从安全模式转换到完全"打开"模式的过程。 (1)当进入安全操作模式时,NameNode和Datanode都处于运行状态,NameNode读取更新的检查点信息以及初始化nameNode的命名空间; (2)NameNode重播编辑日志以及基于检查点信息创建新的命名空间; (3)NameNode创建一个新的检查点(即一个新的fsimage文件,它是前一个fsmage文件的压缩形式,以及从编辑日志应用的所有事务)并保存; (4)打开DataNode,NameNode Web UI和Secondary NameNode的端口开始通信; (5)NameNode进入安全模式,此时不执行HDFS读写操作; (6)NameNode退出安全模式,此时允许HDFS读取和写入; 如果有大量的编辑日志,可能是因为Secondary NameNode已经丢失了一段时间,NameNode会在一段时间内保持安全模式状态。 如果为fsimage文件配置了多个冗余存储位置,则NameNode以并行方式写入所有fsimage文件,但仍保持安全模式,直到完成所有位置写入。在那之前,不能有任何客户端连接到HDFS。 可以通过NameNode Web UI,在NameNode启动时立即跟踪NameNode重新启动过程,UI会显示加载fsimage和编辑日志的完成百分比,如下图所示。 博主推荐阅读: https://www.cnblogs.com/yinzhengjie2020/p/13363924.html
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。 欢迎加入基础架构自动化运维:598432640,大数据SRE进阶之路:959042252,DevOps进阶之路:526991186