大家好,我是脚丫先生 (o^^o)
前面介绍了HDFS的API操作,那么接下来就对HDFS原理之
核心设计
与
工作机制
进行详细的分析。
好了,我们开始今天的正文。
一、HDFS心跳机制
在网络环境中
,一定会存在数据丢失和延迟的可能。
如果
DataNode节点
一上线,就直接向
NameNode
汇报,下线也汇报。但是,很多时候由于网络环境问题,DataNode下线的时候根本来不及报告。
因此在设计中,就模仿了动物的心跳,每隔一段时间跳动一次。
DataNode
向
NameNode
汇报也采取心跳模式,那么从DataNode一上线开始,就每隔一段时间汇报,如果隔了一段时间NameNode还没有接受到DataNode的汇报信息的话,就可以猜测,它是不是挂了。
NameNode去判断DataNode到底是死了还是活呢?
- 1 心跳:DataNode每隔一段时间向NameNode发送一个心跳数据包
-
2 检查:当某个DataNode达到一定时间的时候, NameNode也没有收到心跳数据NameNode就默认它已经挂掉了。但是还不能确认。所以
启动检查机制
:检查两次, 每次间隔五分钟。
在这里,必须要先说明下
HDFS文件系统里的进程启动顺序:
先启动namenode
再启动所有的datanode
然后启动secondarynamenode
总结 :
- 1 Hadoop 中包含了两个独立的主从架构(Master / Slave)的集群:HDFS 和 YARN。HDFS的主节点的守护进程是:NameNode,从节点的守护进程是 DataNode。YARN的主节点的守护进程是:ResourceManager,从节点的守护进程是 NodeManager。(以下Master为NameNode,slave为DataNode)
- 2 Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信)Server 服务,等待 Slave 的链接。
-
3 Slave 启动时,会主动链接 Master 的 IPC 服务,并且每隔3秒链接一次 Master,这个间隔时间是可以调整的,参数为
dfs.heartbeat.interval
,这个每隔一段时间去连接一次的机制,我们形象的称为心跳。Slave 通过心跳汇报自己的信息给 Master,Master 也通过心跳给Slave下达命令。 - 4 NameNode 通过心跳得知 DataNode 的状态,ResourceManager 通过心跳得知 NodeManager 的状态。 如果 master 长时间都没有收到 slave 的心跳,就认为该slave挂掉了。
注意:
Namenode感知到Datanode掉线死亡的时长计算:
HDFS 默认的超时时间为 10分钟+30秒,也就是 630s。 这里暂且定义超时时间为 timeout 计算公式为:
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
默认的
heartbeat.recheck.interval
大小为5分钟,
dfs.heartbeat.interval
默认的大小为3秒。
需要注意的是 hdfs-site.xml配置文件中的 heartbeat.recheck.interval 的单位为毫秒,dfs.heartbeat.interval 的单位为秒 所以,举个例子,如果heartbeat.recheck.interval设置为5000(毫秒),dfs.heartbeat.interval设置为3(秒,默认),则总的超时时间为40秒。
<property>
<name>heartbeat.recheck.interval</name>
<value>5000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
二、HDFS安全模式
HDFS的安全模式的
进入条件
有两种情况:
- 1 刚启动的时候,还没有接受到所有的datanode的汇报所以不确定哪些文件齐全,哪些文件由数据丢失。等待所有的datanode都汇报了达到一个效果 所有的数据都都还在,HDFS的安全会自动退出。反之,也是自动进入的。
- 2 当HDFS的数据块丢失达到一定比例时:0.1% 。HDFS也会自动进入安全模式。
- 3 可以通过手动的方式让HDFS进入安全模式。
在 HDFS 集群正常冷启动时,NameNode 也会在 SafeMode 状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可
。
正常启动的时候进入安全的原理:
-
1、NameNode的
内存元数据
中,包含文件存储目录的路径、副本数、blockid,及每一个block所在DataNode的信息,而
fsimage
中,不包含block所在的DataNode信息。 -
2、当NameNode冷启动时,此时内存中的元数据只能从
fsimage
中加载而来,从而就没有block所在的DataNode信息,就会导致NameNode认为所有的block都已经丢失从而HDFS会自动进入安全模式 -
3、伴随着每个DataNode启动后,会定期向NameNode汇报自身所持有的blockid信息,随着DataNode陆续启动,从而陆续汇报block信息,NameNode就会将内存元数据中的block所在DataNode信息补全更新 ,当HDFS集群中的每个文件都找到了所有block的位置,从而自动退出安全模式。
安全模式常用操作命令:
hdfs dfsadmin -safemode leave //强制NameNode退出安全模式
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode get //查看安全模式状态
hdfs dfsadmin -safemode wait //等待,一直到安全模式结束
注意:
- 1 安全模式下用户可以进行的操作(不修改元数据的操作):ls查询、cat查看文件内容、get下载
- 2 安全模式下用户不可以进行的操作(修改了元数据的操作):创建目录、上传、修改文件名、文件追加
三、HDFS副本存放策略
四、HDFS负载均衡