hadoop-hdfs集群安全模式详解
HDFS安全模式影响
在安全模式下,文件系统只接受读数据请求,而不接受删除、修改等变更请求
HDFS进入安全模式场景
- NameNode在加载镜像文件和编辑日志期间处于安全模式
- NameNode再接收DataNode注册时处于安全模式
- 在hdfs集群启动服务时会进入安全模式
- 在人为操作时,刻意手动执行hdfs dfsadmin -safemode enter进入安全模式
安全模式相关命令
- 查看安全模式
hdfs dfsadmin -safemode get
- 进入安全模式状
hdfs dfsadmin -safemode enter
- 离开安全模式
hdfs dfsadmin -safemode leave
- 等待安全模式状态恢复
hdfs dfsadmin -safemode wait
安全模式相关功能验证
- 当前hadoop集群状态
[wangting@wt-hadoop101 bin]$ jpsall
=============== wt-hadoop101 92.168.0.3 ===============
3572 NameNode
4042 NodeManager
4220 JobHistoryServer
3695 DataNode
=============== wt-hadoop102 92.168.0.4 ===============
3122 DataNode
3443 NodeManager
3325 ResourceManager
=============== wt-hadoop103 92.168.0.5 ===============
3175 DataNode
3260 SecondaryNameNode
3405 NodeManager
1. 非安全模式( 正常使用模式 )
# 查看当前集群安全模式状态 OFF为关闭
[wangting@wt-hadoop101 ~]$ hdfs dfsadmin -safemode get
Safe mode is OFF
# 创建一个测试文件
[wangting@wt-hadoop101 ~]$ echo `date +%H%M%S` >> date.log
[wangting@wt-hadoop101 ~]$ cat date.log
173241
# 将date.log文件put到hdfs集群存储上
[wangting@wt-hadoop101 ~]$ hdfs dfs -put /home/wangting/date.log /
# 可以成功put并查看
[wangting@wt-hadoop101 ~]$ hdfs dfs -ls /
Found 5 items
-rw-r--r-- 3 wangting supergroup 7 2023-01-27 17:33 /date.log
drwxr-xr-x - wangting supergroup 0 2023-01-16 17:14 /input
drwxr-xr-x - wangting supergroup 0 2023-01-17 10:29 /input202301171020
drwxr-xr-x - wangting supergroup 0 2023-01-16 17:26 /output
drwx------ - wangting supergroup 0 2023-01-16 17:26 /tmp
[wangting@wt-hadoop101 ~]$ hdfs dfs -cat /date.log
173241
[wangting@wt-hadoop101 ~]$ hdfs dfsadmin -safemode get
Safe mode is OFF
# 可以成功创建目录删除目录
[wangting@wt-hadoop101 ~]$ hdfs dfs -mkdir /20230127
[wangting@wt-hadoop101 ~]$ hdfs dfs -rmdir /20230127
2. 安全模式下
# 进入安全模式
[wangting@wt-hadoop101 ~]$ hdfs dfsadmin -safemode enter
Safe mode is ON
# 一旦进入安全模式,无论哪个节点get状态均相同
[wangting@wt-hadoop101 ~]$ hdfs dfsadmin -safemode get
Safe mode is ON
[wangting@wt-hadoop102 bin]$ hdfs dfsadmin -safemode get
Safe mode is ON
[wangting@wt-hadoop103 ~]$ hdfs dfsadmin -safemode get
Safe mode is ON
# 创建一个测试文件
wangting@wt-hadoop101 ~]$ echo `date +%H%M%S` >> date2.log
[wangting@wt-hadoop101 ~]$ cat date2.log
173849
# 安全模式下put文件失败
[wangting@wt-hadoop101 ~]$ hdfs dfs -put /home/wangting/date2.log /
put: Cannot create file/date2.log._COPYING_. Name node is in safe mode.
# 安全模式可以正常的查询目录
[wangting@wt-hadoop101 ~]$ hdfs dfs -ls /
Found 5 items
-rw-r--r-- 3 wangting supergroup 7 2023-01-27 17:33 /date.log
drwxr-xr-x - wangting supergroup 0 2023-01-16 17:14 /input
drwxr-xr-x - wangting supergroup 0 2023-01-17 10:29 /input202301171020
drwxr-xr-x - wangting supergroup 0 2023-01-16 17:26 /output
drwx------ - wangting supergroup 0 2023-01-16 17:26 /tmp
# 安全模式可以正常的查看文件内容
[wangting@wt-hadoop101 ~]$ hdfs dfs -cat /date.log
173241
# 安全模式也可以get获取文件到本地
[wangting@wt-hadoop101 ~]$ mkdir /home/wangting/test
[wangting@wt-hadoop101 ~]$ hdfs dfs -get /date.log /home/wangting/test/
[wangting@wt-hadoop101 ~]$ ls /home/wangting/test/
date.log
[wangting@wt-hadoop101 ~]$ cat /home/wangting/test/date.log
173241
# 安全模式删除操作报错
[wangting@wt-hadoop101 ~]$ hdfs dfs -rm /date.log
rm: Cannot delete /date.log. Name node is in safe mode.
# 安全模式创建目录失败
[wangting@wt-hadoop101 ~]$ hdfs dfs -mkdir /20230127
mkdir: Cannot create directory /20230127. Name node is in safe mode.
3. 退出安全模式
# 参数leave退出
[wangting@wt-hadoop101 ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
# 退出则回到非安全模式,所以操作均为正常执行
[wangting@wt-hadoop101 ~]$ hdfs dfs -put /home/wangting/date2.log /
[wangting@wt-hadoop101 ~]$ hdfs dfs -ls /
Found 6 items
-rw-r--r-- 3 wangting supergroup 7 2023-01-27 17:33 /date.log
-rw-r--r-- 3 wangting supergroup 7 2023-01-27 17:56 /date2.log
drwxr-xr-x - wangting supergroup 0 2023-01-16 17:14 /input
drwxr-xr-x - wangting supergroup 0 2023-01-17 10:29 /input202301171020
drwxr-xr-x - wangting supergroup 0 2023-01-16 17:26 /output
drwx------ - wangting supergroup 0 2023-01-16 17:26 /tmp
4. 等待安全模式状态恢复
# 进入安全模式
[wangting@wt-hadoop101 ~]$ hdfs dfsadmin -safemode enter
Safe mode is ON
# 切换另一个节点(或者重新打开一个回话栏)
# 执行wait相关命令 (&&表示前者命令执行完毕或者成功获取到状态才执行后续命令)
# 此时命令没有任何返回,说明卡在wait等待中
[wangting@wt-hadoop102 ~]$ hdfs dfsadmin -safemode wait && echo "hdfs安全模式已经退出" && hdfs dfs -put /home/wangting/date3.log /
# 回到原窗口将安全模式退出
[wangting@wt-hadoop101 ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
# 此时查看验证命令,put操作也执行成功
[wangting@wt-hadoop102 ~]$ hdfs dfsadmin -safemode wait && echo "hdfs安全模式已经退出" && hdfs dfs -put /home/wangting/date3.log /
Safe mode is OFF
hdfs安全模式已经退出
安全模式相关配置
hdfs-site.xml配置文件
<property>
<name>dfs.namenode.safemode.min.datanodes </name>
<value>0</value>
</property>
参数含义:dfs.namenode.safemode.min.datanodes: 表示离开安全模式的最小可用 datanode 数量要求,默认为 0,即使所有 datanode 都不可用,仍然可以离开安全模式;
例如datanode节点较多,设置为3时,则必须要有三个datanode可用才退出安全模式
<property>
<name>dfs.namenode.safemode.threshold-pct</name>
<value>0.999f</value>
</property>
参数含义:
达到最小副本数的数据块的百分比。默认值0.999f。当小于这个比例,那就将系统切换成安全模式,对数据块进行复制;当大于该比例时,就离开安全模式,说明系统有足够的数据块副本数,可以对外提供服务
如果是为了防止某些异常数据导致始终校验不过的情况,可以尝试将上面的dfs.namenode.safemode.threshold-pct参数调为0或比0小的值后重启NameNode使之生效,这样永远不会进入安全模式