Hadoop升级流程
一、HDFS升级规划
升级Hadoop集群需要细致的规划,特别是HDFS的升级。如果文件系统的布局版本发生变化,升级操作会自动将文件系统数据和元数据迁移到兼容新版本的格式。与其他涉及数据迁移的过程相似,升级操作暗藏数据丢失的风险,因此需要确保数据和元数据都已经备份完毕。
规划过程最好包括在一个小型测试集群上的测试过程,以评估是否能够承担(可能的)数据丢失的损失。测试过程使用户更加熟悉升级过程、了解如何配置本集群和工具集,从而为在产品集群上进行升级工作消除技术障碍。此外,一个测试集群也有助于测试客户端的升级过程。
如果文件系统的布局并未改变,升级集群就非常容易:在集群上安装新版本的Hadoop(客户端也同步安装),关闭旧的守护进程,升级配置文件,启动新的守护进程,令客户端使用新的库。整个过程是可逆的,换言之,也可以方便地还原到旧版本。
如果升级集群会导致文件系统的布局变化,则需要采用下述步骤进行升级。

在执行升级任务之前,确保前一升级已经定妥。
关闭 YARN 和 MapReduce 守护进程。
关闭 HDFS,并备份 namenode 目录。
在集群和客户端安装新版本的 Hadoop。
使用 -upgrade 选项启动 HDFS。
等待,直到升级完成。
检验 HDFS 是否运行正常。
启动 YARN 和 MapReduce 守护进程。
回滚或定妥升级任务(可选的)。

二、HDFS 升级方案制定
2.1 升级方案
HDFS 官方提供两种升级方案:Express 和 RollingUpgrade。
Express 升级过程是停止现有 HDFS 服务,然后使用新版本 HDFS 启动服务,会影响线上业务正常运行。
RollingUpgrade 升级过程是滚动升级,不停服务,对用户无感知。
鉴于 HDFS 停服对业务影响较大,我们最终选择 RollingUpgrade 方案。
2.2 降级方案
RollingUpgrade 方案中,有两种回退方式:Rollback 和 RollingDowngrade。
Rollback 会把 HDFS 版本连同数据状态回退到升级前的那一刻,会造成数据丢失。
RollingDowngrade 只回退 HDFS 版本,数据不受影响。
我们线上 HDFS 集群是不能容忍数据丢失的,我们最终选择 RollingDowngrade 的回退方案。
三、升级步骤
3.1 备份
在升级前最好做好数据和配置文件的备份,以免升级失败需要回滚。[非重点,这里省略具体步骤]
3.2 部署新版本
[分别在 HDFS 集群的所有服务器上执行,本文是 hadoop0/1/2/3]
上传 hadoop-2.9.0.tar.gz 到 /bigdata/ 目录,执行以下命令解压和创建日志目录:
bash
# cd /bigdata/
# tar -zxvf /bigdata/hadoop-2.9.0.tar.gz
# chown -R hdfs:hadoop /bigdata/hadoop-2.9.0
$ su hdfs
$ mkdir /bigdata/hadoop-2.9.0/logs
$ chmod 775 /bigdata/hadoop-2.9.0/logs
把旧的配置文件(*.sh 和 *.xml)替换到新版本的配置目录 /bigdata/hadoop-2.9.0/etc/hadoop/,本文替换了 9 个文件,如下图:

修改所有配置文件里面定义的路径指向新版本的路径,例如是 hadoop-env.sh 的 HADOOP_PREFIX=/bigdata/hadoop-2.9.0
3.3 停止 HDFS 集群
关闭 yarn 高可用相关角色:
bash
yarn-daemon.sh stop resourcemanager
stop-yarn.sh
stop-dfs.sh
hadoop-daemon.sh stop journalnode
3.4 复制数据文件
HDFS 集群的数据文件是保存在 {user.name},此配置可以在 core-site.xml 重新配置,建议修改。
本文因为新旧版本的数据目录都是使用同一个,所以不需要复制数据。否则的话需要把数据复制到新版本指向的数据目录。
3.5 启动 HDFS 集群
在 NameNode 服务器上操作:
使用 root 用户启动安全 DataNodes, NameNode:
bash
$ ./start-all.sh
启动集群后查看日志会显示正在同步数据:
2018-04-27 15:06:36,754 INFO org.apache.hadoop.hdfs.server.common.Storage:
Start linking block files from /bigdata/tmp/hadoop-hdfs/dfs/data/current/BP-185965420-192.168.1.10-1499766135884/previous.tmp/finalized
to /bigdata/tmp/hadoop-hdfs/dfs/data/current/BP-185965420-192.168.1.10-1499766135884/current/finalized
同步数据的时候需要等待一段时间,视乎数据量大小。可以使用 du -sh 查看对应 current 目录大小是否和 previous.tmp 目录大小一致,也可以访问集群的启动过程页面查看:

3.6.1 进入安全模式
在 NameNode 服务器执行以下命令:
bash
# su hdfs
$ kinit hdfs/hadoop0
$ cd /bigdata/hadoop-XXX
$ bin/hdfs dfsadmin -safemode enter
Safe mode is ON
[如果不执行此步骤会提示:Safe mode should be turned ON in order to create namespace image]
3.6.2 滚动升级准备
- 创建 fsimage,用于保证在升级失败时回滚
bash
$ bin/hdfs dfsadmin -rollingUpgrade prepare
$ hdfs dfsadmin -rollingUpgrade query 检查 fsimage 是否创建成功

3.6.3 升级 NameNode 和 SecondaryNameNode
继续在 NameNode 服务器执行以下命令,注意上一步骤已使用 kinit 命令登录 kerberos:
- 关闭 NN2,然后升级 NN2(替换为新版本 hadoop)
bash
hdfs --daemon stop namenode
- 用“-rollingUpgrade started”选项,启动 NN2 作为 StandbyNameNode。
bash
hdfs --daemon start namenode -rollingUpgrade started
- 从 NN1 故障转移到 NN2,以使 NN2 处于 Active,NN1 处于 Standby。
bash
hdfs haadmin -getServiceState nn1
注意:此处的 nn1 为在 hdfs-site.xml 中配置的 namenode 服务的名称。
确定要转为 active 的 namenode 的 id,这里将 namenode1 设为 active,使用命令行工具进行状态切换:
bash
hdfs haadmin -failover --forcefence --forceactive nn1 nn2
如果手动命令切换不成功,可以命令停止 NN1,观察是否自动切换。
- 关闭 NN1,然后升级 NN1(替换为新版本 hadoop)
bash
hdfs --daemon stop namenode
- 用 "rollingUpgrade started”选项,启动 NN1 作为 Standby。
bash
hdfs --daemon start namenode -rollingUpgrade started
3.6.4 升级所有 DataNode
分别在所有 DataNode 执行以下命令:
bash
# su hdfs
$ kinit hdfs/hadoop1
- 选择一小部分 DataNode(所有的 DataNode 都在一个特定的机架上)。
- 运行命令“hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade”,关闭选中的 DataNode
bash
hdfs dfsadmin -shutdownDatanode bigdatanode03:50020 upgrade
这种方式如果不行,直接使用命令停止
bash
hdfs --daemon stop datanode
- 运行命令“hdfs dfsadmin -getDatanodeInfo bigdatanode03:50020”检查等待 DataNode 关闭
- 升级和重新启动 DataNode(替换为新版本 hadoop)
bash
hdfs --daemon start datanode
- 在所有选中的机器上运行上边的步骤,一次选中的 DataNode 可以并行操作。
3.6.5 完成滚动升级
bash
% hdfs dfsadmin -finalizeUpgrade
% hdfs dfsadmin -upgradeProgress status
There are no upgrades in progress.
3.7 检查数据完整性
在 NameNode 服务器上操作:
上传 CheckHDFSShell.jar 到 /bigdata/hadoop-2.9.0/ 目录,然后执行以下命令:
bash
# su hdfs
$ cd /bigdata/hadoop-2.9.0
$ bin/hadoop jar CheckHDFSShell.jar
hdfs.CheckHDFSIntegrity
hdfs://hadoop0:9000
/user hdfs/hadoop0@BDP.DOMAIN
/bigdata/kerberos-1.16/var/krb5kdc/hdfs.keytab
升级降级相关命令
bash
hdfs dfsadmin -rollingUpgrade <query|prepare|finalize>
hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> [upgrade]
hdfs namenode -rollingUpgrade <rollback|started>
总结
本文介绍了升级 Hadoop 集群的步骤和注意事项,特别是 HDFS 的升级。
升级 Hadoop 集群需要进行规划,特别是对 HDFS 的升级需谨慎。升级操作可能导致数据丢失风险,因此在开始升级之前,务必备份数据和元数据。
建议在小型测试集群上进行升级测试,以评估可能的数据丢失风险。测试过程可以帮助用户熟悉升级过程和配置,消除技术障碍,并测试客户端的升级过程。
如果文件系统的布局没有改变,升级集群相对容易。步骤包括安装新版本的 Hadoop、关闭旧的守护进程、升级配置文件、启动新的守护进程,以及让客户端使用新的库。
升级成功后,需要执行清理步骤,包括移除旧的安装和配置文件,并修复 "被弃用" 警告信息。
Hadoop 集群管理工具(Cloudera Manager 和 Apache Ambari)简化了升级过程,使得滚动升级成为可能。它们支持批量升级节点,以减少对客户端的服务中断。
如果 HDFS 文件系统布局发生变化,需要进行额外的升级步骤。在升级之前,需要确保之前一次升级已经完成,关闭相关守护进程,备份 namenode 目录,安装新版本的 Hadoop,并使用 -upgrade 选项启动 HDFS 等。
在升级之前,建议使用 fsck 工具检查文件系统的状态,并保留和比较输出报告。另外,清空临时文件也是一个好的实践。
定妥升级是指在满意于新版本的 HDFS 后,移除升级前的存储目录。在执行新的升级任务之前,需要执行该步骤。
综上所述,本文提供了详细的升级步骤和注意事项,帮助用户顺利升级 Hadoop 集群,并保护数据的安全性。

end
