前言

在分布式系统中,整个集群是由主节点和从节点相互配合工作的,其中主节点作为这个集群的老大,承担着更高的职责以及风险,主节点的好坏也决定了整个集群是否能正常的对外工作,因此理解主节点的生命周期是很重要且有意义的事,下面小编将借助源码介绍一下HDFS中主节点Namenode的启动流程,看看它在启动的过程中做了哪些事情。

NameNode启动流程解析

进入Hadoop的NameNode类中可以发现,在NameNode的类里面一共创建了两个服务端,如图所示,分别是HttpServer服务端以及RpcServer服务端,其中HttpServer服务端通过绑定各种servlet供用户进行请求,用户可以访问50070端口来请求查看集群使用的各种资源,集群元数据的合并请求也是通过http请求进行的,而RpcServer服务端的作用主要是用来接收从节点以及client端发送过来的请求,比如说从节点datanode的心跳上报,client端的读写请求等等(其中主从节点之间通信的框架采用的是RPC框架)。

启动hdfs过后用jps只有一行 启动hdfs有几个进程_hdfs


HDFS除了在Namenode启动时开启两种类型的Server之外为了能够快速的对外提供服务,还会进行元数据的加载,即将磁盘中的元数据加载到内存,以方便client端快速访问,如图所示。

启动hdfs过后用jps只有一行 启动hdfs有几个进程_元数据_02


开启服务和元数据的加载工作后,Namenode还会做一个很重要的工作,就是判断是否需要进入安全模式,为了能够安全的提供服务,避免集群能够正常稳定地运行,集群会进行安全模式的判断,一旦集群进入安全模式后,整个集群只对外提供读数据的服务,任何更改和删除操作均不可用,对于是否需要进入安全模式的判断语句如图所示。

启动hdfs过后用jps只有一行 启动hdfs有几个进程_服务端_03


整个方法返回的是一个布尔型的值,其中总共有三个判别语句,三个判别语句的意思分别如下:

  • first:blockSafe代表的是Namenode启动后datanode向Namenode汇报的可用的block的数量,blockThreshold代表的是上一次集群结束后所记录的可用block数*设置的阈值,一旦通过心跳汇报上来的可用的block数量小于上一次集群关闭后计算出来的block数阈值,就说明需要进入安全模式了。
  • second:获取存活的datanode数量是否小于自己设定的阈值,一旦小于自己设定的阈值(默认是0),集群就需要进入安全模式。
  • third:查看存储元数据的磁盘目录是否还有足够空间(默认是看是否小于100M),如果存储空间不够,也将进入安全模式。

上述是否进入安全模式的判断结束后,namenode进程还会开启心跳监听线程来接收各个datanode集将发来的心跳,如图所示。

启动hdfs过后用jps只有一行 启动hdfs有几个进程_安全模式_04


至此整个namenode的启动流程也就到此结束了。简而言之,namenode的启动流程可以包含以下5个部分:

  1. 开启HttpServer服务端
  2. 进行元数据的加载工作
  3. 开启RpcServer服务端
  4. 判断是否进入安全模式
  5. 开启心跳监听线程