一、HDFS升级规划
升级 Hadoop 集群需要细致的规划,特别是 HDFS 的升级。如果文件系统的布局的版本发生变化,升级操作会自动将文件系统数据和元数据迁移到兼容新版本的格式。与其他涉及数据迁移的过程相似,升级操作暗藏数据丟失的风险,因此需要确保数据和元数据都已经备份完毕。
规划过程最好包括在一个小型测试集群上的测试过程,以评估是否能够承担(可能的)数据丢失的损失。测试过程使用户更加熟悉升级过程、了解如何配置本集群和工具集,从而为在产品集群上进行升级工作消除技术障碍。此外,一个测试集群也有助于测试客户端的升级过程。
如果文件系统的布局并未改变,升级集群就非常容易:在集群上安装新版本的 Hadoop(客户端也同步安装),关闭旧的守护进程,升级配置文件, 启动新的守护进程,令客户端使用新的库。整个过程是可逆的,换言之, 也可以方便地还原到旧版本。
如果升级集群会导致文件系统的布局变化,则需要采用下述步骤进行升级。
在执行升级任务之前,确保前一升级已经定妥。 关闭 YARN 和 MapReduce 守护进程。 关闭 HDFS,并备份 namenode 目录。 在集群和客户端安装新版本的 Hadoop。 使用 -upgrade 选项启动 HDFS 等待,直到升级完成。 检验 HDFS 是否运行正常。 启动 YARN 和 MapReduce 守护进程。 回滚或定妥升级任务(可选的)。
二、HDFS 升级方案制定
2.1 升级方案
HDFS 官方提供两种升级方案:Express 和 RollingUpgrade。
xpress 升级过程是停止现有 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/目录,执行以下命令解压和创建日志目录:
# 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.03.3 停止HDFS集群关闭yarn高可用相关角色
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:
$ ./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服务器执行以下命令:
# 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,用于保证在升级失败时回滚
$ bin/hdfs dfsadmin -rollingUpgrade prepare $ hdfs dfsadmin -rollingUpgrade query 检查fsimage是否创建成功
3.6.3 升级NameNode和SecondaryNameNode
继续在NameNode服务器执行以下命令,注意上一步骤已使用kinit命令登录kerberos:
1.关闭NN2,然后升级NN2(替换为新版本hadoop) hdfs --daemon stop namenode 2.用“-rollingUpgrade started”选项,启动NN2作为StandbyNameNode。 hdfs --daemon start namenode -rollingUpgrade started 3.从NN1故障转移到NN2,以使NN2处于Active,NN1处于Standby。 hdfs haadmin -getServiceState nn1 注意:此处的nn1为在hdfs-site.xml中配置的namenode服务的名称。 确定要转为active的namenode的id,这里将namenode1设为active,使用命令行工具进行状态切换: hdfs haadmin -failover --forcefence --forceactive nn1 nn2 如果手动命令切换不成功,可以命令停止NN1,观察是否自动切换。 4.关闭NN1,然后升级NN1(替换为新版本hadoop) hdfs --daemon stop namenode 5.用"rollingUpgrade started”选项,启动NN1作为Standby“。 hdfs --daemon start namenode -rollingUpgrade started
3.6.4 升级所有DataNode
分别在所有DataNode执行以下命令:
# su hdfs $ kinit hdfs/hadoop1 1.选择一小部分DataNode(所有的DataNode都在一个特定的机架上)。 2.运行命令“hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade”,关闭选中的DataNode hdfs dfsadmin -shutdownDatanode bigdatanode03:50020 upgrade 这种方式如果不行,直接使用命令停止 hdfs --daemon stop datanode 3.运行命令“hdfs dfsadmin -getDatanodeInfo bigdatanode03:50020”检查等待DataNode关闭 4.升级和重新启动DataNode(替换为新版本hadoop) hdfs --daemon start datanode 5.在所有选中的机器上运行上边的步骤,一次选中的DataNode可以并行操作。
3.6.5完成滚动升级
% hdfs dfsadmin -finalizeUpgrade % hdfs dfsadmin -upgradeProgress status There are no upgrades in progress.
3.7 检查数据完整性
在NameNode服务器上操作:
上传CheckHDFSShell.jar到/bigdata/hadoop-2.9.0/目录,然后执行以下命令:
# 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
升级降级相关命令
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集群,并保护数据的安全性。