Stale DN 特性概述
默认情况下,HDFS 集群中一个 DN 意外退出或 down 掉后,NameNode 并不会立刻作出响应,而是一直要等到 10min 30s 之后,才会把此 DN 标记为 dead,之后该 DN 不可读写。这个过程中存在的问题是:从 DN down 掉到变为 dead,整个过程耗时较长,在这段时间内,该 DN 仍然有可能被读写,从而导致客户端读写出错。
启用了 Stale DN 特性之后,一个意外 down 掉的 DN 可以在较短时间内(默认30s)就变为 stale DN,一个 stale DN 的读写优先级会被降到最低,从而可以最大程度的避免客户端读写这个 DN,尽量避免客户端读写出错。
查看当前集群 stale DN 信息
-
NameNode Web 页面上,所有 Last contact 大于 stale interval(默认30s)的 DN,全都是 stale DN。
-
NameNode jmx 中的 NumStaleDataNodes 项表示 stale DN 的个数(实际使用中将 192.168.202.11:50070 替换为真实的 NN http 地址):
http://192.168.202.11:50070/jmx?get=Hadoop:service=NameNode,name=FSNamesystem::StaleDataNodes注意:NameNode 中 HeartbeatManager 周期性更新这个值(周期即为 stale interval,默认30s),因此,该值最多可能有长达 stale interval 的延迟。
Stale DN 写相关事项
- 打开避免写 stale DN 特性,需打开如下选项(默认 false):
<property>
<name>dfs.namenode.avoid.write.stale.datanode</name>
<value>true</value>
</property>
-
如果集群中剩余的正常 DN 个数已无法达到目标副本系数(例如:目标副本系数为3,但集群中仅剩余2个正常 DN),则 NN 也会尝试分配 stale DN,随后 client 会尝试写 stale DN.
-
如果集群中 stale DN 达到一定比例,那么 NN 不再区分 stale DN 与正常 DN,全部默认可写,这样做的目的是防止明显的数据倾斜,该比例的配置如下(默认0.5):
<property>
<name>dfs.namenode.write.stale.datanode.ratio</name>
<value>0.5</value>
</property>
Stale DN 读相关事项
- 打开避免读 stale DN 特性,需打开如下选项(默认 false):
<property>
<name>dfs.namenode.avoid.read.stale.datanode</name>
<value>true</value>
</property>
- 如果集群中剩余的正常 DN 已经无法读到目标 block,则 client 也会尝试读取 stale DN 上的 block.
网友评论