Namenode中的安全模式
安全模式是Namenode的一种状态,处于安全模式中的Namenode不接受任何对于命名空间的修改操作,同时也不触发任何复制和删除数据块的操作。
Namenode启动时会自动进入安全模式状态,用户可以通过“dfsadmin -safemode value”命令来操作安全模式,这个命令在底层是由DFSClient调用setSafeMode方法实现的。
Namenode启动时会首先加载fsimage文件并且合并编辑editlog文件,完成这些操作之后Namenode的第一关系也就建立起来了。之后Namenode需要接受Datanode的块汇报以获得数据块的存储信息,也就是建立第二关系。这些操作都是Namenode在安全模式中进行的,只有当Namenode收集到的阈值比例满足最低副本系数的数据块时才可以离开安全模式。当Namenode发现阈值比例满足之后,会延迟一段时间推出安全模式,目的是等待那些还没有进行块汇报的数据节点进行块汇报,这个延迟时间默认是30s。之后,Namenode就可以顺利推出安全模式了。
最低副本系数指一个数据块应该拥有的最少的副本数量,默认为1。而阈值比例指的是已经收集到的满足最低副本系数的数据块数量与HDFS文件系统中所有数据块的比例,默认为0.999。
但是如果是客户端通过远程接口setSafeMode()进入安全模式的,是不可以自动退出安全模式的,必须由客户端手动调用远程接口setSafeMode()退出安全模式。
1.SafeModeInfo
安全模式相关的操作都是由SafeMode接口抽象的,SafeMode由FSNamesystem类实现,而在FSNamesystem中则是使用内部类SafeModeInfo记录安全模式的配置新、Namenode收集到的数据块信息以及Namenode当前的安全模式状态。
下面是其一些比较重要的字段:
(1)threshold:保存离开安全模式的阈值比例
(2)safeReplication:保存数据块最低副本系数
(3)extension:保存离开安全模式等待时间
(4)blockSafe:记录已经满足最小副本数的数据块数量
(5)blockTotal:记录HDFS文件系统中所有数据块的数量
(6)reached:记录安全模式的状态,0表示当前线程处于安全模式,>0表示阈值系数已经满足,<0表示已经退出了安全模式。
SafeModeInfo对于安全模式的管理主要是通过reached字段完成的。调用enter()方法会进入安全模式,设置reached字段为0;调用leave()方法会退出安全模式,设置reached为-1,并释放safeModeInfo对象。isOn()方法用于判断当前Namenode是否处于安全模式,它直接通过判断reached字段的值来进行判断。
2.开启复制和删除数据块功能
在安全模式中,Namenode是不会开启复制数据块和删除数据块功能的,但是在下面两种情况下,Namenode会调用initializeReplQueus()方法启动复制和删除操作。
(1)在checkMode()方法中会调用canInitializeReplQueus()方法判断修改了blockSafe数量的当前Namenode是否满足重新开启复制和删除操作的条件,如果满足则调用initializeReplQueus()方法启动复制和删除数据块功能。
(2)Namnode离开安全模式时,由于已经离开了安全模式,也就没有必要关闭复制和删除操作了,这时也会调用initializeReplQueus()方法恢复复制和删除数据块的功能。
1万+

被折叠的 条评论
为什么被折叠?



