HDFS 滚动升级允许单独升级每一个HDFS进程。例如,DataNode可以独立于NameNode升级。一个NameNode可以独立于其他的NameNode升级。NameNode可以独立于DataNode和JournalNode升级。
在Hadoop V2中,HDFS支持NameNode服务的HA和前后兼容。这两个能力使在线升级HDFS成为可能。为了在线升级一个HDFS集群,集群必须以HA安装。
在HA的集群中,有两个或者更多的NameNode,很多DataNode,几个JournalNode和几个ZookeeperNode。JNs是相对稳定的,在大多数情况下,升级HDFS不需要升级JNs。这里描述滚动升级的过程,只考虑NameNode和DataNode,不考虑JNs和ZKNs。升级JNs和ZKNs可能会引起停机时间。
假设有两个NameNode NN1和NN2,NN1和NN2分别处在Active和Standby状态。下面是升级一个HA集群的步骤:
1. 准备滚动升级
1. 运行命令“hdfs dfsadmin-rollingUpgrade prepare”,为滚动创建一个FsImage。
2. 运行命令“hdfsdfsadmin -rollingUpgrade query”,检查滚动Image的状态。等一会接着重新运行这个命令直到“Proceed with rolling upgrade”消息出现。
2 .升级Active和Standby NNs
1. 关闭NN2,然后升级NN2
2. 用“-rollingUpgrade started”选项,启动NN2作为StandbyNameNode。
3. 从NN1故障转移到NN2,以使NN2处于Active,NN1处于Standby。
4. 关闭NN1,然后升级NN1。
5. 用"rollingUpgrade started”选项,启动NN1作为Standby“。
3 . 升级DNs
1. 选择一小部分DataNode(所有的DataNode都在一个特定的机架上)。
1. 运行命令“hdfsdfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade”,关闭选中的DataNode
2. 运行命令“hdfsdfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>”检查等待DataNode关闭
3. 升级和重新启动DataNode
4. 在所有选中的机器上运行上边的步骤,一次选中的DataNode可以并行操作。
2. 重新运行上边的步骤直到集群中的所有DataNode被升级。
4 . 结束滚动升级
1. 运行“hdfsdfsadmin -rollingUpgrade finalize”结束滚动操作。
在联邦的集群中,有多个命名空间,每一个命名空间都有一对NN,一个Active,一个Standby。升级一个联邦的集群和升级一个非联邦的集群除了步骤1和步骤4需要运行在每一个命名空间,步骤2运行在每一个NNs对之外,其余是相同的。
1. 准备每一个命名空间的滚动升级
2. 升级每一个命名空间的Active和Standby NN。
3. 升级DNs。
4. 结束每一个命名空间的滚动升级。
对于非HA的集群,没有停机时间升级HDFS是不可能的,因为升级需要重新启动NameNode。但是,DataNode仍然可以以滚动的方式升级。
在一个非HA的集群中,只有一个NN,一个SNN和多个DN。升级一个非HA集群与升级一个HA的集群类似,除了步骤2,升级Active和Standby NN被改为下面这样:
u 升级一个NN和SNN
1. 关闭SNN
2. 关闭和升级NN
3. 用“-rollingUpgrade started”选项启动NN
4. 升级和重启SNN
当升级后的版本不尽人意或者,在一些看似不太可能的情况下,升级失败(因为新版本的bug),管理员可能选择降级HDFS到之前的版本,或者回滚HDFS到升级之前的版本和升级之前的状态。不管是降级还是回滚都需要集群停机时间,不能以滚动的方式完成。
注意降级和滚回操作只能发生在滚动升级开始之后,升级结束之前。一次升级过程可被finalize或者downgrade或者rollback结束。因此,在finalize或者downgrade之后运行rollback是不可能的,在finalize之后执行downgrade也是不可能的。
Downgrade将软件恢复到升级之前的版本同时保存用户数据。假设时间T是滚动升级的开始时间,升级被Downgrade结束。然后,在T之前或之后创建的文件在HDFS中都可用。在T之前或之后删除的文件,就保持删除。
如果NameNode的版本和DataNode的版本在两个HDFS版本中没有没改,一个新版本可以降级到升级之前的版本。下面是降级的步骤:
u 降级HDFS
1. 关闭所有的NN和DN
2. 在所有的机器上恢复到升级之前的版本。
3. 用“-rollingUpgrade rollback”选项启动NN
4. 正常启动DN
Rollback恢复HDFS的状态到升级之前的版本,但是会将用户数据重置会升级之前的状态。假设时间T是滚动升级的开始时间,升级被Rollback结束。在T之前创建的文件被保存,在T之后创建的文件将变得不可用。在T之前删除的文件保持删除,在T之后删除的文件会被恢复。
从一个新版本回滚回升级之前的状态总是被支持的。下面是回滚的步骤:
u Rollback HDFS
1. 关闭所有的NN和DN
2. 恢复所有机器上升级之前的HDFS版本
3. 用-rollingUpgrade rollback选项启动NN
4. 正常启动DN
hdfs dfsadmin-rollingUpgrade <query|start|finalize>
执行滚动升级操作
u 选项
query |
Query the current rolling upgrade status. |
prepare |
Prepare a new rolling upgrade. |
finalize |
Finalize the current rolling upgrade. |
hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
获取指定DataNode的信息。这个命令可被用来检出一个DataNode是否是alive,类似于Unix的ping命令。
hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> [upgrade]
向给定的DataNode提交一个关机请求,如果,可选参数upgrade被指定。访问DataNode的客户端将被建议等待直到DataNode重启同时开启快速启动模式。当重启没有及时的发生,客户端超时,然后忽视这个DataNode。在这种情况下,快速启动模式将被禁止。
注意:命令不能等到DataNode关闭来完成。如果DataNode关闭没有完成,命令“dfsadmin -getDatanodeInfo”可被用来检查DataNode状态。
hdfs namenode -rollingUpgrade <downgrade|rollback|started>
当滚动升级正在进行中时,启动选项-rollingUpgrade用来指定不同的滚动升级:
downgrade |
Restores the namenode back to the pre-upgrade release and preserves the user data. |
rollback |
Restores the namenode back to the pre-upgrade release but also reverts the user data back to the pre-upgrade state. |
started |
Specifies a rolling upgrade already started so that the namenode should allow image directories with different layout versions during startup. |