Hadoop版本升級(2.7.6 => 3.1.2)

  本身的主機上的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

  解決方法:服務器

  1. 備份HDFS的NameNode元數據,升級後,對比升級先後的文件信息。
  2. 單臺升級DataNode,觀察升級先後的Block數(有較小浮動範圍,v2與v3的計數方式不同)。

第一階段 停機以及備份NameNode目錄

經過命令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

   下載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"以檢查回滾映像的狀態。等待並從新運行該命令,直到顯示「繼續滾動升級」消息。

   

 

第四階段 升級NN與SNN

  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

  

第五階段 升級DN

  因爲我升級的Hadoop是僞分佈式的,NameNode和DataNode是在同一節點上,按集羣升級分類來講,屬於非HA集羣升級。在這裏,升級DataNode是比較簡單的,在新版本的Hadoop上從新啓動DataNode便可,等待一會,DataNode自動升級成功。

# $HADOOP_HOME/bin/hdfs --daemon start datanode 

  不管Hadoop是非HA仍是HA,且是徹底分佈式的話,DataNode節點較多的狀況下,能夠參考官方文檔的思路(寫腳本實現):

  1. 選擇一小部分數據節點(例如特定機架下的全部數據節點)
    1. 運行「hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade」以關閉其中一個選定的數據節點。
    2. 運行"hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>"以檢查並等待datanode關閉。
    3. 升級並從新啓動datanode
    4. 對子集中全部選定的數據節點並行執行上述步驟。

  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權威指南(第四版)》

      https://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-hdfs/HdfsRollingUpgrade.html#Upgrade_with_Downtime

相關文章
相關標籤/搜索