10.3.4 系统升级
升级HDFS和MapReduce集群需要一个合理的操作步骤,这里我们主要讲解HDFS的升级。如果文件系统升级后文件格局发生了变化,那么升级时会将文件系统的数据和元数据迁移到与新版本一致的格式上。由于任何涉及数据迁移的操作都会导致数据的丢失,所以必须保证数据和元数据都有备份(具体操作参看10.3.2节)。在进行升级时,可以先在小型集群中进行测试,以便正式运行时可以解决所有问题。
Hadoop对自身的兼容性要求非常高,所有Hadoop 1.0之前版本的兼容性要求最严格,只有来自相同发布版本的组件才能保证相互的兼容性,这就意味着整个系统从守护进程到客户端都要同时更新,还需要集群停机一段时间。后期发布的版本支持回滚升级,允许集群守护进程分阶段升级,以便在更新期间可以运行客户端。
如果文件系统的布局不改变,那么集群升级就非常简单了。首先在集群中安装新的HDFS和MapRedude(同时在客户端也要安装),然后关闭旧的守护进程,升级配置文件,启动新的守护进程和客户端更新库。这个过程是可逆的,因此升级后的版本回滚到之前版本也很简单。
每次成功升级后都要执行一系列的清除步骤:
1)从集群上删除旧的安装和配置文件;
2)修复代码和配置中的每个错误警告。
以上讲解的系统升级非常简单,但是如果需要升级文件系统,就需要更进一步的操作。
如果使用以上讲解方法进行升级,并且HDFS是一个不同的布局版本,那么NameNode就不会正常运行。NameNode的日志会产生以下信息:
File system image contains an old layout version-15.
An upgrade to version-18 is required.
Please restart NameNode with-upgrade option.
要想确定是否需要升级文件系统,最好的办法就是在一个小集群上进行测试。
HDFS升级将复制以前版本的元数据和数据。升级并不需要两倍的集群存储空间,因为DataNode使用硬链接来保留对同一个数据块的两个引用,这样就可以在需要的时候轻松实现回滚到以前版本的文件系统。
需要注意的是,升级后只能保留前一个版本的文件系统,而不能回滚到多个文件系统,因此执行另一个对HDFS的升级需要删除以前的版本,这个过程被称为确定更新(finalizing the upgrade)。一旦更新被确定,那HDFS就不会回滚到以前的版本了。
需要说明的是,只有可以正常运作的健康的系统才能被正确升级。在进行升级之前,必须进行一个全面的fsck操作。为防止意外,可以将系统中的所有文件及块的列表(fsck的输出)进行备份。这样就可以在升级后将运行的输出与之对比,检测是否全部正确升级,有没有数据丢失。
还需要注意,在升级之前要删除临时文件,包括HDFS上MapReduce系统目录中的文件和本地临时文件。
完成以上这些工作后就可以进行集群的升级和文件系统的迁移了,具体步骤如下:
1)确保之前的升级操作全部完成,不会影响此次升级;
2)关闭MapReduce,终止TaskTracker上的所有任务进程;
3)关闭HDFS并备份NameNode目录;
4)在集群和客户端上安装新版本的Hadoop HDFS和同步的MapReduce;
5)使用-upgrade选项启动HDFS;
6)等待操作完成;
7)在HDFS上进行健康检查;
8)启动MapReduce;
9)回滚或确定升级。
在运行升级程序时,最好能从PATH环境变量中删除Hadoop脚本,这样可以避免运行不确定版本的脚本程序。在安装目录定义两个环境变量是很方便的,在以下指令中已经定义了OLD_HADOOP_INSTALL和NEW_HADOOP_INSTALL。在以上步骤5)中我们要运行以下指令:
$NEW_HADOOP_INSTALL/bin/start-dfs.sh-upgrade
NameNode升级它的元数据,并将以前的版本放入新建的目录previous中:
${dfs.name.dir}/current/VERSION
/edits
/fsimage
/fstime
/previous/VERSION
/edits
/fsimage
/fstime
采用类似的方式,DataNode升级它的存储目录,将旧的目录复制到previous目录中去。
升级过程需要一段时间才能完成。可以使用dfsadmin命令来检查升级的进度。升级的事件同样会记录在守护进程的日志文件中。在步骤6)中执行以下命令:
$NEW_HADOOP_INSTALL/bin/hadoop dfsadmin-upgradeProgress status
Upgrade for version-18 has been completed.
Upgrade is not finalized.
以上代码表明升级已经完成。在这个阶段必须在文件系统上进行一些健康检查(即步骤7),比如使用fsck进行文件和块的检查)。当进行检查(只读模式)时,可以让HDFS进入安全模式,以防止其他检查对文件进行更改。
步骤9)是可选操作,如果在升级后发现问题,则可以回滚到之前版本。
首先,关闭新的守护进程:
$NEW_HADOOP_INSTALL/bin/stop-dfs.sh
然后,用-rollback选项启动旧版本的HDFS:
$OLD_HADOOP_INSTALL/bin/start-dfs.sh-rollback
这个命令会使用NameNode和DataNode以前的副本替换它们当前存储目录下的内容,文件系统立即返回原始状态。
如果对新升级的版本感到满意,那么可以执行确定升级(即步骤9),可选),并删除以前的存储目录。需要注意的是在升级确定后,就不能回滚到之前的版本了。
需要执行以下步骤,才能进行另一次升级:
$NEW_HADOOP_INSTALL/bin/hadoop dfsadmin-fnalizeUpgrade
$NEW_HADOOP_INSTALL/bin/hadoop dfsadmin-upgradeProgress status
There are no upgrades in progress.
至此,HDFS升级到了最新版本。