1.说明
HDFS滚动升级允许独立的升级单个HDFS守护进程。比如说:datanodes可以独立于namenodes单独升级,一个namenode可以独立于其它的namenodes单独升级,namenodes可以独立于datanodes和journal nodes单独升级。
2.升级
在hadoop v2中,HDFS支持高可用的namenodes提供服务和线性的兼容。这两个功能使得升级HDFS而不用停机成为可能,为了在不停机的情况下升级HDFS集群,集群必须是HA方式。
如果一个特性在新版本的软件可以使用,但是在升级后导致老版本的软件不可用,在这种情况下升级需要下面的步骤:
1.禁用新特性
2.升级集群
3.开启新特性
注意:滚动升级从Hadoop-2.4.0才开始支持的。
3.不停机升级
在HA集群中,会有两个及以上的NameNodes(NNs)、许多DataNodes(DNs)、少量的JournalNodes(JNs)和少量的ZookeeperNodes(ZKNs),JNs是比较稳定的,在大多数情况下升级HDFS集群是不需要升级它的;在这里描述的滚动升级的过程中只有NNs和DNs被考虑进去了,JNs和ZKNs不考虑。升级JNs和ZKNs可能需要集群停机。
3.1.升级非联邦集群
假设有两个NameNode为NN1和NN2,其中NN1处于Active状态,NN2处于Standby状态,下面的步骤是升级一个HA集群:
3.1.1.准备升级
1)运行命令 “hdfs dfsadmin -rollingUpgrade prepare”创建一个rollback的fsimage。
①命令执行完成之后在主从的hdfs的fsimage目录中都会产生类似如下的文件,从节点的会延迟一会。
fsimage_rollback_0000000000000026420
fsimage_rollback_0000000000000026420.md5
②在DataNode存放数据的位置的每一个NameSpace对应的文件夹中都会包含一个名称叫做 RollingUpgradeInProgress 的空文件。
③在主从的NameNode上都能看到如下的标识
2)运行命令 “hdfs dfsadmin -rollingUpgrade query”用于检测rollback image的状态,等待或者重新运行命令直到看到“Proceed with rolling upgrade”这个消息的出现。
3.1.2.升级Active和Standby NNs
1)停止升级NN2
2)使用命令“hadoop-daemon.sh start namenode -rollingUpgrade started”启动NN2作为Standby状态的NN
3)切换NN的主从,将NN1切换为Standby状态,NN2切换为Active状态
4)停止并升级NN1
5)使用命令“hadoop-daemon.sh start namenode -rollingUpgrade started”启动NN1作为Standby状态的NN
3.1.3.升级DNs
1)选择一小部分DataNodes(比如:在某个特定机架下的所有的DataNodes)
a)运行命令“hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade”停止选择的DataNodes
b)运行命令 “hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>”检测并等待DataNodes停止
c)升级并重启DataNodes(此处的升级不需要特殊的操作,直接重启即可,DataNode在重启后会自动判断进入升级模式,创建previous目录保留历史数据)
d)对于选择的DataNodes并行的执行上面的操作
2)重复上面的操作,把集群中的所有的DataNodes都升级了。
3.1.4.固化滚动升级
1)运行命令 “hdfs dfsadmin -rollingUpgrade finalize”固化集群的滚动升级
3.2.升级联邦集群
对于Federation的集群,会有多个NameSpace,每个NameSpace都会有一对Active和Standby的NameNode,升级Federation的集群的过程和升级非Federation的集群的过程很相似,不同之处是步骤1和步骤4需要在每个NameSpace上执行,步骤2需要在每对Active和Standby的NNs上都执行。也就是:
1)为每个NameSpace准备滚动升级
2)为每个NameSpace升级每对Active和Standby的NN
3)升级DNs
4)为每个NameSpace固化滚动升级
4.停机升级
对于非HA集群,它是不能在不停机的情况下升级HDFS,因为它需要重启NameNode。然而,DataNodes仍然可以采用滚动升级的方式。
4.1.升级非HA集群
在非HA的集群,会有一个NameNode(NN)、一个SecondaryNameNode(SNN)和许多DataNodes(DNs),升级非HA的集群的过程和升级HA集群的过程很相似,除了步骤2“升级Active和Standby NNs”需要改成下面的方式:
升级NN和SNN
1)停止SNN
2)停止并升级NN
3)加上参数 “-rollingUpgrade started”启动NN
4)升级并重启SNN
5.降级和回滚
当已经升级的版本达不到预期,或者其它的类似的情况,升级失败(由于新版本中的bugs),管理员可能选择降级HDFS到升级前的版本,或者回滚HDFS到升级前的版本状态。
注意:降级可以使用滚动的方式完成,但是回滚不行,回滚需要集群停机才行。
还要注意:降级和回滚只有在滚动升级已经开始,但是升级没有终止之前才行。升级操作可以通过固化、降级、或者回滚来结束。因此,它不能在执行了固化或者降级之后进行回滚,或则固化之后执行降级。
5.1.降级
降级恢复软件到升级前的版本并保留用户数据,假设时间T是滚动升级开始时间,并且升级是通过降级的方式结束的,因此,在T时间之前或者之后创建的文件在HDFS中是有效的,在时间T之前或者之后删除的文件需要保持删除的状态。
只能在新版本和升级前的版本的NameNode的布局版本和DataNode的布局版本没有改变的情况下,才能从新版本降级到升级前的版本,
在HA集群,当从老版本到新版本的滚动升级正在进行中,想要将已升级的机器返回到旧版本的软件,采用滚动的方式降级是可行的,和之前类似,假设NN1是Active状态的,NN2是Standby状态的,下面的步骤是不停机的情况下滚动降级:
5.1.1.降级DNs
1)选择一小部分DataNodes(比如:在某个特定机架下的所有的DataNodes)
a)运行命令“hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade”停止选择的DataNodes
b)运行命令 “hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>”检测并等待DataNodes停止
c)降级并重启DataNodes
d)对于选择的DataNodes并行的执行上面的操作
2)重复上面的操作,把集群中的所有的DataNodes都降级了。
5.1.2.降级Active和Standby的NNs
1)停止并降级NN2
2)正常启动NN2作为Standby
3)切换NN的主从,让NN2变为Active状态的,NN1变为Standby状态的
4)停止并降级NN1
5)正常启动NN1作为Standby的
5.1.3.固化滚动降级
1)运行命令 “hdfs dfsadmin -rollingUpgrade finalize”固化滚动降级
注意:在降级NameNode之前必须要先降级DataNodes,因为协议可以向后兼容,但是不能向前兼容,也就是老版本的DataNodes可以和新版本的NameNode通信,但是反之不行。
5.2.回滚
回滚恢复软件到升级前的版本但是用户数据也会被返回到升级前的状态。假设时间T是滚动升级开始时间,升级是通过回滚的方式结束,在时间T之前创建的文件在HDFS中是有效的,但是在时间T之后创建的会失效,在时间T之前删除的文件在HDFS中会保留删除的状态,但是在时间T之后删除的文件会被恢复。
从新版本回滚到升级前的版本通常是支持的。然而,它不能以滚动的方式完成,它需要集群停机。假设NN1是Active状态的,NN2是Standby状态的,下面是回滚的步骤:
回滚HDFS:
1)停止所有的NNs和DNs
2)在所有的机器上恢复升级前的版本
3)加上参数 “-rollingUpgrade rollback”启动NN1作为Active的NN
4)在NN2上执行同步操作 `-bootstrapStandby’,之后启动NN2作为Standby状态的NN
5)加上参数“-rollback”启动DNs(可以使用命令 start-dfs.sh -rollback启动DNs)
6.滚动升级启动选项的命令
6.1.DFSAdmin命令
6.1.1.dfsadmin -rollingUpgrade
hdfs dfsadmin -rollingUpgrade <query|prepare|finalize>
执行滚动升级的动作.
选项:
query :查询当前滚动升级的状态
prepare :准备新的滚动升级
finalize :固化当前的滚动升级
6.1.2.dfsadmin -getDatanodeInfo
hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
获取指定DataNode的信息,这个命令用于检测指定的DataNode是否存活,和linux的ping命令类似。
6.1.3.dfsadmin -shutdownDatanode
hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> [upgrade]
提交一个停止datanode的请求,如果指定了可选的升级参数参数 upgrade ,将会建议访问DataNode的客户端等待重启,并且启用快速重启模式。当没有及时重启时,客户端将会超时,并且忽略这个DataNode,在这种情况下,快速重启模式也会被禁用。
注意:这个命令不会等待DataNode关闭完成,命令 “dfsadmin -getDatanodeInfo”被用来检测DataNode关闭是否完成。
6.2. NameNode启动选项
6.2.1.namenode -rollingUpgrade
hdfs namenode -rollingUpgrade <rollback|started>
当滚动升级正在进行中,参数-rollingUpgrade 是NameNode用于指定各种滚动升级的启动选项
选项:
rollback :恢复NameNode到升级前的版本,同样也会将用户的数据回滚到升级前的状态。
started :指示滚动升级已经开始,这样的话在启动NameNode时,允许image目录有不同的布局版本号。
警告:downgrade选项已经过时,启动NameNode是不需要明确的指定downgrade选项的。