本身的主机上的Hadoop版本是2.7.6,是测试用的伪分布式Hadoop,在前段时间部署了Hive on Spark,但因为没有作好功课,致使了Hive没法正常启动,缘由在于Hive 3.x版本不适配Hadoop 2.x版本。以前我在学校服务器上部署的Hadoop版本是3.1.2,现打算将本身的从2.7.6升级到3.1.2版本,同时也看成练练手并记录以便之后参考。这是一个大版本跨度的升级操做,因此先参考Hadoop权威指南上的方案以及官方文档,而后拟定了升级和回滚方案。html
根据官方文档所说:node
”For non-HA clusters, it is impossible to upgrade HDFS without downtime since it requires restarting the namenodes. However, datanodes can still be upgraded in a rolling manner.“apache
也就是说对于非HA群集,因为须要从新启动名称节点,所以没法在没有停机的状况下升级HDFS。可是,仍能够回滚方式升级datanode。vim
注意:仅从Hadoop-2.4.0开始支持滚动升级。
安全
Hadoop升级最主要是HDFS的升级,HDFS的升级是否成功,才是升级的关键,若是升级出现数据丢失,则其余升级就变得毫无心义。bash
解决方法:服务器
经过命令stop-yarn.sh和stop-dfs.sh关闭HDFS集群:分布式
# stop-yarn.sh # stop-dfs.sh
而后备份NameNode目录到NFS或者其余文件系统中,若是不记得NameNode目录存储的地址能够经过查看hdfs-site.xml文件的:oop
# vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
下载Hadoop 3.1.2后解压,最好移除PATH环境变量下的Hadoop脚本,这样的话,就不会混淆针对不一样版本的脚本。将HADOOP_HOME指向新的Hadoop:测试
接下来将${HADOOP_HOME}/etc/hadoop/hdfs-site.xml中的dfs.namenode.name.dir和dfs.datanode.data.dir属性的值分别指向Hadoop 2.7.6的hdfs-site.xml的dfs.namenode.name.dir和dfs.datanode.data.dir属性的值。
在hdfs-site.xml增长属性:
<property> <name>dfs.namenode.duringRollingUpgrade.enable</name> <value>true</value> </property>
先启动旧版本的Hadoop:
# /usr/local/hadoop/sbin/start-dfs.sh
进入安全模式:
# hdfs dfsadmin -safemode enter
准备滚动升级:
1. 运行“hdfs dfsadmin -rollingUpgrade prepare”以建立用于回滚的fsimage。
2. 运行"hdfs dfsadmin -rollingUpgrade query"以检查回滚映像的状态。等待并从新运行该命令,直到显示“继续滚动升级”消息。
1. 关闭SNN:
# /usr/local/hadoop/sbin/hadoop-daemon.sh stop secondarynamenode
2. 关闭NameNode和DataNode:
# /usr/local/hadoop/sbin/hadoop-daemon.sh stop namenode
# /usr/local/hadoop/sbin/hadoop-daemon.sh stop datanode
3. 在新版本的Hadoop使用“-rollingUpgrade started”选项启动NN:
进入新版本的Hadoop目录,而后以升级的方式启动NameNode:
# $HADOOP_HOME/bin/hdfs --daemon start namenode -rollingUpgrade started
升级hdfs花费的时间不长,升级丢失数据的风险几乎没有。
接下来升级并重启SNN:
# $HADOOP_HOME/bin/hdfs --daemon start secondarynamenode
因为我升级的Hadoop是伪分布式的,NameNode和DataNode是在同一节点上,按集群升级分类来讲,属于非HA集群升级。在这里,升级DataNode是比较简单的,在新版本的Hadoop上从新启动DataNode便可,等待一会,DataNode自动升级成功。
# $HADOOP_HOME/bin/hdfs --daemon start datanode
不管Hadoop是非HA仍是HA,且是彻底分布式的话,DataNode节点较多的状况下,能够参考官方文档的思路(写脚本实现):
2. 重复上述步骤,直到升级群集中的全部数据节点。
等待升级完成后,能够查看Web页面,NameNode和DataNode版本已经升级为3.1.2版本:
此时能够已完成滚动升级:
# $HADOOP_HOME/bin/hdfs dfsadmin -rollingUpgrade finalize
若是升级失败,能够随时回滚,回滚,数据会回滚到升级前那一刻的数据,升级后的数据修改,所有失效,回滚启动步骤以下:
# /usr/local/hadoop-2.7.6/bin/hadoop-daemon.sh start namenode –rollback # /usr/local/hadoop-2.7.6/bin/hadoop-daemon.sh start datanode –rollback
遇到的问题:
参考网址: https://stackoverflow.com/questions/21369102/hadoop-command-not-found
解决方法:查找配置环境变量的文件,/etc/profile、~/.bashrc、hadoop-env.sh,发如今~/.bashrc文件中配置了HADOOP_HOME,用了旧版本的路径,删除或者更新为新的环境变量便可。
参考资料: 《Hadoop权威指南(第四版)》