首页 > 代码库 > HDFS Rolling Upgrade

HDFS Rolling Upgrade

HDFS Rolling Upgrade

Introduction

HDFS 滚动升级允许单独升级每一个HDFS进程。例如,DataNode可以独立于NameNode升级。一个NameNode可以独立于其他的NameNode升级。NameNode可以独立于DataNode和JournalNode升级。

Upgrade

在Hadoop V2中,HDFS支持NameNode服务的HA和前后兼容。这两个能力使在线升级HDFS成为可能。为了在线升级一个HDFS集群,集群必须以HA安装。

Upgrade without Downtime

在HA的集群中,有两个或者更多的NameNode,很多DataNode,几个JournalNode和几个ZookeeperNode。JNs是相对稳定的,在大多数情况下,升级HDFS不需要升级JNs。这里描述滚动升级的过程,只考虑NameNode和DataNode,不考虑JNs和ZKNs。升级JNs和ZKNs可能会引起停机时间。

Upgrading Non-Federated Clusters

假设有两个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”结束滚动操作。

Upgrade Federated Clusters

在联邦的集群中,有多个命名空间,每一个命名空间都有一对NN,一个Active,一个Standby。升级一个联邦的集群和升级一个非联邦的集群除了步骤1和步骤4需要运行在每一个命名空间,步骤2运行在每一个NNs对之外,其余是相同的。

1.      准备每一个命名空间的滚动升级

2.      升级每一个命名空间的Active和Standby NN。

3.      升级DNs。

4.      结束每一个命名空间的滚动升级。

Upgrade with Downtime

对于非HA的集群,没有停机时间升级HDFS是不可能的,因为升级需要重新启动NameNode。但是,DataNode仍然可以以滚动的方式升级。

Upgrading Non-HA Clusters

在一个非HA的集群中,只有一个NN,一个SNN和多个DN。升级一个非HA集群与升级一个HA的集群类似,除了步骤2,升级Active和Standby NN被改为下面这样:

u  升级一个NN和SNN

1.      关闭SNN

2.      关闭和升级NN

3.      用“-rollingUpgrade started”选项启动NN

4.      升级和重启SNN

Downgrade and Rollback

当升级后的版本不尽人意或者,在一些看似不太可能的情况下,升级失败(因为新版本的bug),管理员可能选择降级HDFS到之前的版本,或者回滚HDFS到升级之前的版本和升级之前的状态。不管是降级还是回滚都需要集群停机时间,不能以滚动的方式完成。

注意降级和滚回操作只能发生在滚动升级开始之后,升级结束之前。一次升级过程可被finalize或者downgrade或者rollback结束。因此,在finalize或者downgrade之后运行rollback是不可能的,在finalize之后执行downgrade也是不可能的。

Downgrade

Downgrade将软件恢复到升级之前的版本同时保存用户数据。假设时间T是滚动升级的开始时间,升级被Downgrade结束。然后,在T之前或之后创建的文件在HDFS中都可用。在T之前或之后删除的文件,就保持删除。

如果NameNode的版本和DataNode的版本在两个HDFS版本中没有没改,一个新版本可以降级到升级之前的版本。下面是降级的步骤:

u  降级HDFS

1.      关闭所有的NN和DN

2.      在所有的机器上恢复到升级之前的版本。

3.      用“-rollingUpgrade rollback”选项启动NN

4.      正常启动DN

RollBack

Rollback恢复HDFS的状态到升级之前的版本,但是会将用户数据重置会升级之前的状态。假设时间T是滚动升级的开始时间,升级被Rollback结束。在T之前创建的文件被保存,在T之后创建的文件将变得不可用。在T之前删除的文件保持删除,在T之后删除的文件会被恢复。

从一个新版本回滚回升级之前的状态总是被支持的。下面是回滚的步骤:

u  Rollback HDFS

1.      关闭所有的NN和DN

2.      恢复所有机器上升级之前的HDFS版本

3.      用-rollingUpgrade rollback选项启动NN

4.      正常启动DN

Commands and Startup Options forRolling Upgrade

DFSAdmin Commands

dfsadmin-rollingUpgrade

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.

dfsadmin –getDatanodeInfo

hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>

获取指定DataNode的信息。这个命令可被用来检出一个DataNode是否是alive,类似于Unix的ping命令。

dfsadmin-shutdownDatanode

hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> [upgrade]

向给定的DataNode提交一个关机请求,如果,可选参数upgrade被指定。访问DataNode的客户端将被建议等待直到DataNode重启同时开启快速启动模式。当重启没有及时的发生,客户端超时,然后忽视这个DataNode。在这种情况下,快速启动模式将被禁止。

注意:命令不能等到DataNode关闭来完成。如果DataNode关闭没有完成,命令“dfsadmin -getDatanodeInfo”可被用来检查DataNode状态。

NameNode Startup Options

namenode-rollingUpgrade

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.