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 )。

安全模式相关命令

  1. $ hdfs dfsadmin -safemode get # 查看安全模式的状态
  2. Safe mode is OFF
  3. $ hdfs dfsadmin -safemode enter # 进入安全模式
  4. Safe mode is ON
  5. $ hdfs dfsadmin -safemode leave # 离开安全模式
  6. Safe mode is OFF
  7. $ hdfs dfsadmin -safemode wait # 等待安全模式
  8. Safe mode is OFF

在上述命令中,前三个都好理解,但最后一个等待安全模式可能没那么好理解,简单来说,等待安全模式相当于shell脚本中的sleep命令,只是这个 sleep ,没有定义多长时间,它是等待集群离开安全模式后,sleep自然也就结束了。下面来个简单示例。

进入安全模式

  1. $ hdfs dfsadmin -safemode enter
  2. Safe mode is ON
  3. $ hdfs dfs -put anaconda-ks.cfg / # 验证无法上传文件
  4. put: Cannot create file/anaconda-ks.cfg._COPYING_. Name node is in safe mode.

编写shell脚本

  1. $ cat > test.sh << EOF
  2. #!/usr/bin/env bash
  3. hdfs dfsadmin -safemode wait # 等待安全模式
  4. hdfs dfs -put anaconda-ks.cfg / # 进行上传操作
  5. EOF
  6. $ sh -x test.sh # 执行此脚本后,会发现终端一直在执行下面的等待操作,无论多久
  7. + hdfs dfsadmin -safemode wait
  8. $ hdfs dfsadmin -safemode leave # 新开一个终端,离开安全模式
  9. Safe mode is OFF
  10. $ sh -x test.sh # 回到当前终端,会发现脚本立即执行完成了,最后的上传动作也完成了
  11. + hdfs dfsadmin -safemode wait
  12. Safe mode is OFF
  13. + hdfs dfs -put anaconda-ks.cfg /

1