实验目的:
实验一:验证NameNode启动时确实会进入安全模式,检查数据块的完整性,如果数据块是完整的,会退出安全模式,正常响应读写请求
实验二:验证NameNode启动时确实会进入安全模式,如果未达到配置文件规定个数的DataNode启动,会一直处于安全模式,直到达到规定个数的DataNode都启动后,才会退出安全模式
实验三:验证在NameNode进程运行过程中,如果突然出现了datanode进程挂掉或数据块不完整,是否能重新进入安全模式?
试验环境:
3个节点组成的简单分布式集群,1个NameNode,2个DataNode
修改配置:
在master主机的配置文件中增加以下参数:
文件路径是/usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop/hdfs-
<property>
<name> </name>
<value>2</value>
</property>
参数含义::表示离开安全模式的最小可用 datanode 数量要求,默认为 0,即使所有 datanode 都不可用,仍然可以离开安全模式,因此设置为2,必须两个datanode可用才退出安全模式
实验步骤:
实验一:
1)先不启动hdfs集群(如果hdfs已经启动,执行停止集群),在master和slave1,slave2,运行查看安全模式命令hadoop dfsadmin -safemode get,出现结果都是:
safemode: Call From master/192.168.56.10 to master:9000 failed on connection exception: : 拒绝连接; For more details see: /hadoop/ConnectionRefused
说明namenode进程没有启动,查看安全模式命令是无效的,安全模式本质上是namenode的安全模式
2)在任意节点运行脚本来启动集群,同时立即在另外一个节点多次尝试运行命令hadoop dfsadmin -safemode get来检查安全模式,输出结果:
[root@slave1 sbin]# hadoop dfsadmin -safemode get
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
safemode: Call From slave1/192.168.56.11 to master:9000 failed on connection exception: : 拒绝连接; For more details see: /hadoop/ConnectionRefused
[root@slave1 sbin]# hadoop dfsadmin -safemode get
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
Safe mode is ON
[root@slave1 sbin]# jps
4119 DataNode
4265 SecondaryNameNode
4442 Jps
[root@slave1 sbin]# hadoop dfsadmin -safemode get
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
Safe mode is OFF
实验一结论:证明namenode启动后,确实先会处于安全模式,大约过了几十秒后,会退出安全模式,能够正常读写
实验二:
1)执行停止整个hdfs集群运行(每台主机的所有进程都停掉),在master运行 start namenode命令,先只启动NameNode进程
2)运行查看安全模式命令hadoop dfsadmin -safemode get,都会输出Safe mode is ON
3)在slave1运行 start datanode,启动第1个datanode,再运行查看安全模式命令hadoop dfsadmin -safemode get,仍会输出Safe mode is ON
4)在slave2运行 start datanode,启动第2个datanode,再运行查看安全模式命令hadoop dfsadmin -safemode get,会输出Safe mode is OFF
实验二结论:证明NameNode进程启动后,确实先会处于安全模式,达到配置参数所表示的退出安全模式的最小可用 DataNode数量要求2后,才退出安全模式
实验三:
第一种情况:hdfs集群正常运行过程中,突然出现了datanode节点挂掉
1)构造datanode节点挂掉的情况,slave1和slave2两个主机执行kill命令杀掉datanode进程,用来模拟datanode节点挂掉的情况
2)过了数分钟后,执行检查安全模式命令 hadoop dfsadmin -safemode get,一直输出Safe mode is OFF
第二种情况:hdfs集群正常运行过程中,突然出现了数据块损坏
1)构造datanode数据块的不完整性:修改slave1或slave2主机本地文件系统上存放数据块的目录名 mv /root/hdfs/tmp /root/hdfs/tmp1
2)过了数分钟后,执行检查安全模式命令 hadoop dfsadmin -safemode get,一直输出Safe mode is OFF
3)用kill命令杀掉slave1和slave2上的datanode进程,再次尝试执行检查安全模式命令 hadoop dfsadmin -safemode get,仍然一直输出Safe mode is OFF
实验三结论:证明NameNode只有启动时会进入安全模式,如果已经退出安全模式,即使所有的数据块都丢失,或者所有DataNode进程都挂掉,NameNode都不会再次进入安全模式
补充实验:
hdfs集群正常运行过程中,突然出现了NameNode的元数据的持久化镜像文件损坏
1)构造NameNode元数据的不完整性:修改master主机本地文件系统上存放元数据fsimage镜像的目录名 mv /root/hdfs/tmp /root/hdfs/tmp1
2)立即执行检查安全模式命令 hadoop dfsadmin -safemode get,会立即输出Safe mode is ON
补充实验结论:证明NameNode即使退出安全模式,如果出现了元数据的持久化镜像文件都丢失,NameNode会立即再次进入安全模式
===========================理论说明=========================
与安全模式相关的参数在配置文件 中,主要有以下几个关键参数:
: 每个数据块最小副本数量,默认为 1. 在上传文件时,达到最小副本数,就认为上传是成功的。
-pct: 达到最小副本数的数据块的百分比。默认为0.999f。当小于这个比例,那就将系统切换成安全模式,对数据块进行复制;当大于该比例时,就离开安全模式,说明系统有足够的数据块副本数,可以对外提供服务。小于等于 0 意味不进入安全模式,大于 1 意味一直处于安全模式。
: 离开安全模式的最小可用 datanode 数量要求,默认为 0.也就是即使所有 datanode 都不可用,仍然可以离开安全模式。
: 当集群可用 block 比例,可用 datanode 都达到要求之后,如果在 extension 配置的时间段之后依然能满足要求,此时集群才离开安全模式。单位为毫秒,默认为 30000.也就是当满足条件并且能够维持 30 秒之后,离开安全模式。这个配置主要是对集群稳定程度做进一步的确认。避免达到要求后马上又不符合安全标准。
NameNode要离开安全模式,需要满足以下条件:
1)达到副本数量要求的数据块比例满足配置文件的要求;
2)可用的 DataNode节点数满足配置文件的数量要求;
3) 1、2 两个条件满足后维持的时间达到配置的要求