本身的主機上的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權威指南(第四版)》