改版通知

巨人肩膀网站已全新改版。若您仍依赖旧站功能或数据,欢迎联系我们,我们会协助处理。联系我们

Hadoop升级流程

ckckck2025年1月11日39 浏览

一、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:

  1. 关闭 NN2,然后升级 NN2(替换为新版本 hadoop)
bash 复制代码
hdfs --daemon stop namenode
  1. 用“-rollingUpgrade started”选项,启动 NN2 作为 StandbyNameNode。
bash 复制代码
hdfs --daemon start namenode -rollingUpgrade started
  1. 从 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,观察是否自动切换。

  1. 关闭 NN1,然后升级 NN1(替换为新版本 hadoop)
bash 复制代码
hdfs --daemon stop namenode
  1. 用 "rollingUpgrade started”选项,启动 NN1 作为 Standby。
bash 复制代码
hdfs --daemon start namenode -rollingUpgrade started

3.6.4 升级所有 DataNode

分别在所有 DataNode 执行以下命令:

bash 复制代码
# su hdfs
$ kinit hdfs/hadoop1
  1. 选择一小部分 DataNode(所有的 DataNode 都在一个特定的机架上)。
  2. 运行命令“hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade”,关闭选中的 DataNode
bash 复制代码
hdfs dfsadmin -shutdownDatanode bigdatanode03:50020 upgrade

这种方式如果不行,直接使用命令停止

bash 复制代码
hdfs --daemon stop datanode
  1. 运行命令“hdfs dfsadmin -getDatanodeInfo bigdatanode03:50020”检查等待 DataNode 关闭
  2. 升级和重新启动 DataNode(替换为新版本 hadoop)
bash 复制代码
hdfs --daemon start datanode
  1. 在所有选中的机器上运行上边的步骤,一次选中的 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