HDFS安全模式介绍 2015-06-27 22:00

简介

安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略进行必要的复制或者删除部分数据块。

我理解设计安全模式的目的在于:HDFS启动过程中,NameNode还无法获取DataNode上各数据块的状态,无法保证可以正常对外提供数据存储服务。为保护系统安全和数据的完整,在此期间不对外提供服务。待NameNode完全获知各DataNode上各数据块的状态,并根据策略完成必要的复制或删除数据块后,再退出安全模式,对外开始提供服务。

进入安全模式

  • NameNode启动过程中自动进入安全模式

NameNode启动过程中会自动进入安全模式。

那何时退出安全模式呢?启动过程中,各DataNode向NameNode上报各个数据块的状态(含副本数)。当NameNode检测到达到最小副本数(dfs.replication.min)的数据块比率达到99.9%(可通过参数配置)时,退出安全模式.

假设我们设置的副本数(即参数dfs.replication)是5,最小副本数(dfs.replication.min)是3。HDFS总共有10个数据块。如果有7个数据块上报副本数是4(达到最小副本数),3块数据块上报副本数是2(未达到最小副本数)。那么此时,达到最小副本数的数据块的比例是7/10=70%,小于99.9%。因此,此时要对3个未达到最小副本数的数据块进行复制。待达到最小副本数的数据块的比例达到99.9%后,退出安全模式。

注意:并不需要等待所有的数据块完成所有副本的复制后(fully replicated,每个数据块都5个副本),才退出安全模式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<property>
    <name>dfs.safemode.threshold.pct</name>
    <value>0.999f</value>
    <description>指定应有多少比例的数据块满足最小副本数要求,才退出安全模式。
        小于等于0意味不进入安全模式,大于1意味一直处于安全模式。</description>
</property>
<property>
    <name>ddfs.replication.min</name>
    <value>2</value>
    <description>最小副本数,默认为1</description>
</property>
<property>
    <name>dfs.safemode.extension</name>
    <value>30</value>
    <description>指定系统退出安全模式时需要的延迟时间,默认为30(秒)</description>
</property>
  • 手工执行命令进入安全模式
1
2
3
4
5
6
7
8
# 进入安全模式
hdfs dfsadmin -safemode enter
# 退出安全模式
hdfs dfsadmin -safemode leave
# 查询当前是否处于安全模式
hdfs dfsadmin -safemode get
# 等待HDFS退出安全模式后,再继续执行后面的命令
hdfs dfsadmin -safemode wait

遗留问题

Hadoop2.4.1版本,HDFS手工进入安全模式后,仍可以正常上传文件,而不是预期的报错。原因不明。

参考文档

  1. hadoop安全模式
  2. HDFS的安全模式
  3. Hadoop Wiki
Tags: #HDFS    Post on Hadoop