date: 2020-12-08title: Hadoop 集群安全模式 #标题
tags: Hadoop #标签
categories: Hadoop # 分类
在集群刚启动时,默认集群会进入一段时间安全模式,待集群启动完成后,自动退出安全模式,在安全模式中,我们无法进行写入操作。
NameNode启动
NameNode启动时,首先将Fsimage(镜像文件)载入内存,并执行Edits(编辑日志)中的各项操作,一旦在内存中成功建立文件系统元数据的影响,则创建一个新的Fsimage和一个空的Edits编辑日志,此时,NameNode开始监听DataNode请求。整个过程中,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。
DataNode启动
系统中数据块位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。
安全模式退出判断
如果满足“最小副本条件”,NameNode会在30s之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别( 默认值:dfs.replication.min=1 )。
安全模式相关命令
$ hdfs dfsadmin -safemode get # 查看安全模式的状态
Safe mode is OFF
$ hdfs dfsadmin -safemode enter # 进入安全模式
Safe mode is ON
$ hdfs dfsadmin -safemode leave # 离开安全模式
Safe mode is OFF
$ hdfs dfsadmin -safemode wait # 等待安全模式
Safe mode is OFF
在上述命令中,前三个都好理解,但最后一个等待安全模式可能没那么好理解,简单来说,等待安全模式相当于shell脚本中的sleep命令,只是这个 sleep ,没有定义多长时间,它是等待集群离开安全模式后,sleep自然也就结束了。下面来个简单示例。
进入安全模式
$ hdfs dfsadmin -safemode enter
Safe mode is ON
$ hdfs dfs -put anaconda-ks.cfg / # 验证无法上传文件
put: Cannot create file/anaconda-ks.cfg._COPYING_. Name node is in safe mode.
编写shell脚本
$ cat > test.sh << EOF
#!/usr/bin/env bash
hdfs dfsadmin -safemode wait # 等待安全模式
hdfs dfs -put anaconda-ks.cfg / # 进行上传操作
EOF
$ sh -x test.sh # 执行此脚本后,会发现终端一直在执行下面的等待操作,无论多久
+ hdfs dfsadmin -safemode wait
$ hdfs dfsadmin -safemode leave # 新开一个终端,离开安全模式
Safe mode is OFF
$ sh -x test.sh # 回到当前终端,会发现脚本立即执行完成了,最后的上传动作也完成了
+ hdfs dfsadmin -safemode wait
Safe mode is OFF
+ hdfs dfs -put anaconda-ks.cfg /
1