这里,对Hadoop实现的与升级管理相关的实现类进行分析。通过升级管理器,可以对文件系统的状态进行定时升级更新,保证最良好的工作状态。下面从不同的侧面对与分布式升级相关的内容分类分析。
- 升级命令
与升级命令相关的实现类的继承层次关系如下所示:
1、DatanodeCommand抽象类
该抽象类实现Writable接口,因此是可序列化的,也必须实现该接口中提供的读写方法。DatanodeCommand类内部定义了两个实现该抽象类的命令,如下所示:
这两个命令实现类中,对Writeable接口中定义的序列化读写操作并未给出实现,只是一个空动作。
而DatanodeCommand类内部定义了这两各命令作为属性,如下所示:
因为这两个命令实现类不是public的,所以在获取其实例的时候,是通过WritableFactories工厂工具来加载非public类的Writeable实例,如下所示:
该抽象类还定义了一个action代码,表示Datanode需要执行的动作代码,如下所示:
另外,该抽象类应该实现Writeable接口,如下所示:
其实,就是实现动作代码action支持序列化操作。
2、UpgradeCommand类
该类作为分布式升级的通用命令实现。在升级期间,为了能够获取升级所需要的资源,或者是与其它组件共享某些信息,集群组件会向其它组件发送升级命令。其中,升级命令包含升级的版本号信息,使用它来验证升级组件执行升级的状态。
下面看该类定义的升级命令所要执行的动作代码:
该类定义了两个属性:
同样,对现Writeable接口:
支持对两个状态属性的序列化操作。
- 升级状态报告
升级状态报告对应着org.apache.hadoop.hdfs.server.common.UpgradeStatusReport实体类,该类包含了与升级相关的基本状态,包括三个,如下所示:
并且,支持对上述属性的序列化操作。
- 分布式升级对象
与分布式升级相关的实体(对象)实现类,实现了org.apache.hadoop.hdfs.server.common.Upgradeable接口,具体的继承层次关系如下所示:
下面,对上面给出的相关实现进行阅读分析:
1、Upgradeable接口
该接口是分布式升级对象(distributed upgrade objects)的通用接口,定义了一个分布式对象应该具有的基本行为。每一个分布式升级对象都应该存在一个状态,该状态能够体现该升级对象与某个指定的HDFS的版本相关,因此,使用了一个版本号的变量LAYOUT_VERSION来标识分布式升级对象的版本变化,升级的过程实际上是使该对象的对应的LAYOUT_VERSION为最近(最新)的版本,每一个分布式升级对象都对应一个LAYOUT_VERSION,当执行完成升级以后,会返回最新的LAYOUT_VERSION版本号。
该接口的定义如下所示:
上面接口中定义的行为总结如下:
1) LAYOUT_VERSION包含升级对象的所处的版本,也就是根据此版本来确定是否需要升级,以及需要升级到最新的版本;
2)执行升级组件的类型,因为组件不同,它们所处的位置与数据状态时不同的,因此不同的组件执行升级动作是不同的,根据该类型来识别;
3)执行升级过程,应该可以从升级的对象获取到其状态,包括升级完成后的升级报告,通过该状态来掌握集群中升级组件的动态,从而可能需要对不同的升级组件作出合适的决策。
2、UpgradeObject抽象类
该类是升级对象的抽象类,实现了Upgradeable接口。该抽象类主要实现了Upgradeable接口中定义的最基本的方法,并且定义了一个状态变量,如下所示:
该类实现了获取升级状态报告的方法,如下所示:
可想而知,在准备升级之前,一定需要对版本进行比较,从而决定是否升级,已经升级到哪个版本,如下所示:
3、UpgradeObjectNamenode抽象类
该抽象类定义了Namenode类型升级对象的抽象行为。介绍如下:
1)处理升级命令
如下所示:
2)广播:启动升级
如下所示:
执行该方法,能够向需要升级的Datanode广播将要启动升级的消息。
4、UO_Namenode类
该类实现如下所示:
5、UO_Datanode1类
这里拿UO_Namenode1为例,UO_UO_Namenode2、UO_UO_Namenode3也都是基于LAYOUT_VERSION的,如下所示:
UO_UO_Namenode2、UO_UO_Namenode3分别将初始化的LAYOUT_VERSION+1变成LAYOUT_VERSION+2、LAYOUT_VERSION+3。
- 分布式升级管理器
分布式升级管理器涉及到Namenode与Datanode。下面看升级管理器实现类的继承层次关系:
这里,只对UpgradeManager抽象类与UpgradeManagerNamenode实现类进行阅读分析,因为UpgradeManagerDatanode涉及到Datanode进程(org.apache.hadoop.hdfs.server.datanode.DataNode)的实现,这个在后面会详细分析的。
1、UpgradeManager抽象类
该抽象类是通用的升级管理器类。该抽象类定义了如下属性:
该抽象类定义了如下主要操作:
1)获取当前升级对象集合:
2)获取升级进度
3)初始化升级管理器
4)抽象行为
2、UpgradeManagerNamenode类
该类是Namenode的升级管理器实现类,当Namenode在安全模式下,将要退出安全模式的时候,会启动分布式升级进程。这时,Namenode直到升级完成才退出安全模式。在升级过程中,Namenode会处理Datanode提交的命令,并更新它的状态。
1)初始化升级管理器
启动分布式升级过程,需要调用startUpgrade方法,如下所示:
2)处理升级命令
如下所示:
3) 完成升级
如下所示:
4)分布式升级
如下所示:
对UpgradeManagerNamenode类的分析做个总结:
该类实现了,对在Namenode上运行的分布式升级对象执行升级操作的管理。Namenode上的升级进程执行的时机是在安全模式下,更具体地说,是在Namenode进程就要退出安全模式的时刻执行升级工作的,只有等到升级过程中完成以后,Namenode才退出安全模式。经过升级HDFS集群中,由Namenode升级管理器管理的升级对象的状态都会升级到当前最新的状态,当然不排除提交的升级命令中的状态与实际分布式升级对象状态不匹配的情况,这种情况不会执行升级动作的。