Hadoop高可用性部署

Hadoop Ha的原理圖


Hadoop1.X 中NameNode是HDFS集羣的單點故障,每一個集羣只有一個NameNode,如果這個機器或進程不可用,整個集羣就無法使用,直到重啓NameNode或者新啓動一個NameNode節點 
影響HDFS集羣不可用主要包括以下兩種情況 
    - 類似機器宕機這樣的意外情況將導致集羣不可用,只有重啓NameNode之後纔可使用 
    - 計劃內的軟件或硬件升級,將導致集羣在短時間範圍內不可用。

Hadoop2.X的HDFS的高可用性(HA)就可以解決上述問題,通過提供選擇運行在同一集羣中的一個熱備的“主/備”兩個冗餘NameNode,允許在機器宕機或系統維護的時候,快速轉移到另一個NameNode。

架構解釋如下
  • 只有一個NameNode是Active的,並且只有這個ActiveNameNode能提供服務,改變NameSpace。以後可以考慮讓StandbyNameNode提供讀服務。

  • 提供手動Failover,在升級過程中,Failvoer在NameNode-DataNode之間寫不變的情況下才能生效。

  • 在之前的NameNode重新恢復之後,不能提供failback。

  • 數據一致性比Failover更重要

  • 儘量少用特殊的硬件

  • HA的設置和Failover都應該保證在兩者操作錯誤或者配置錯誤的時候,不得導致數據損壞

  • NameNode的短期垃圾回收不應該觸發Failover

  • DataNode會同時向NameNode Active和NameNode Standly彙報塊的信息。NameNode Active和NameNode Standby通過NFS備份MetaData信息到一個磁盤上面。

環境搭建

設定有4太機器,分別爲node1,node2,node3,node3

1. 配置機器如下:

 NNDNJNZKZKFC
node11  11
node211111
node3 111 
node4 11  

2. 在hadoop集羣配置的基礎上hadoop的HDFS集羣的搭建,需要做的改進:

   1)在node1,node2上配置免密鑰。

   2)刪除每臺機器上面的masters文件(masters是設置SNN的,在Hadoop高可用中,沒有SNN,而是提供兩個NN)。

   3) 修改配置文件,先在一臺機器上修改,然後同步到其他的機器上:

          hadoop-env.sh 中配置JAVA_HOME;

          hdfs-site.xml和core-site.xml

         注意:清空hadoop.tmp.dir的文件目錄,每臺機器都要做。

    core-site.xml配置:

  

  1. <configuration>  
  2. <property>  
  3.     <name>fs.defaultFS</name>  
  4.     <value>hdfs://ns1</value>  
  5. </property>  
  6. <property>  
  7.     <name>hadoop.tmp.dir</name>  
  8.     <value>/home/tmp/data</value>  
  9. </property>  
  10. <property>  
  11.     <name>ha.zookeeper.quorum</name>  
  12.     <value>node1:2181,node2:2181,node3:2181</value>  
  13. </property>  
  14. </configuration>  

   hdfs-site.xml配置:

  1. <configuration>  
  2. <property>  
  3.     <name>dfs.nameservices</name>  
  4.     <value>ns1</value>  
  5. </property>  
  6. <property>  
  7.     <name>dfs.ha.namenodes.ns1</name>  
  8.     <value>nn1,nn2</value>  
  9. </property>  
  10. <!-- nn1的RPC通信地址,nn1所在地址  -->  
  11. <property>  
  12.     <name>dfs.namenode.rpc-address.ns1.nn1</name>  
  13.     <value>node1:8020</value>  
  14. </property>  
  15. <!-- nn1的http通信地址,外部訪問地址 -->  
  16. <property>  
  17.     <name>dfs.namenode.http-address.ns1.nn1</name>  
  18.     <value>node1:50070</value>  
  19. </property>  
  20. <!-- nn2的RPC通信地址,nn2所在地址 -->  
  21. <property>  
  22.     <name>dfs.namenode.rpc-address.ns1.nn2</name>  
  23.     <value>node2:8020</value>  
  24. </property>  
  25. <!-- nn2的http通信地址,外部訪問地址 -->  
  26. <property>  
  27.     <name>dfs.namenode.http-address.ns1.nn2</name>  
  28.     <value>node2:50070</value>  
  29. </property>  
  30. <!-- 指定NameNode的元數據在JournalNode日誌上的存放位置(一般和zookeeper部署在一起) -->  
  31. <property>  
  32.     <name>dfs.namenode.shared.edits.dir</name>  
  33.     <value>qjournal://node2:8485;node3:8485;node4:8485/ns1</value>  
  34. </property>  
  35. <!-- 指定JournalNode在本地磁盤存放數據的位置 -->  
  36. <property>  
  37.     <name>dfs.journalnode.edits.dir</name>  
  38.     <value>/opt/journal/data</value>  
  39. </property>  
  40. <!--客戶端通過代理訪問namenode,訪問文件系統,HDFS 客戶端與Active 節點通信的Java 類,使用其確定Active 節點是否活躍  -->  
  41. <property>  
  42.     <name>dfs.client.failover.proxy.provider.ns1</name>  
  43.     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
  44. </property>  
  45. <!--這是配置自動切換的方法,有多種使用方法,具體可以看官網,在文末會給地址,這裏是遠程登錄殺死的方法  -->  
  46. <property>  
  47.     <name>dfs.ha.fencing.methods</name>  
  48.     <value>sshfence</value>     ----這個參數的值可以有多種,你也可以換成shell(/bin/true)試試,也是可以的,這個腳本do nothing 返回0  
  49. </property>  
  50. <!-- 這個是使用sshfence隔離機制時才需要配置ssh免登陸 -->  
  51. <property>  
  52.     <name>dfs.ha.fencing.ssh.private-key-files</name>  
  53.     <value>/root/.ssh/id_rsa</value>  
  54. </property>  
  55. <!-- 配置sshfence隔離機制超時時間,這個屬性同上,如果你是用腳本的方法切換,這個應該是可以不配置的 -->  
  56. <property>  
  57.     <name>dfs.ha.fencing.ssh.connect-timeout</name>  
  58.     <value>30000</value>  
  59. </property>  
  60. <!-- 這個是開啓自動故障轉移,如果你沒有自動故障轉移,這個可以先不配 -->  
  61. <property>  
  62.     <name>dfs.ha.automatic-failover.enabled</name>  
  63.     <value>true</value>  
  64. </property>  
  65. </configuration>  

4)安裝zookeeper並且配置環境變量ZOOKEEPER_HOME,把zoo_example.cfg重命名爲zoo.cfg配置文件

    默認配置如下圖:

  

在文件結尾添加 zookeeper服務器的配置:

  1. server.1=node1:2888:3888
  2. server.2=node2:2888:3888
  3. server.3=node3:2888:3888

    然後分別在node1,2,3dataDir目錄下創建myid文件 。對應機器的myid裏分別寫入1, 2, 3

   5)先啓動JN,在node2,3,4上各自執行以下命令:

          hadoop-daemon.sh start journalnode

  6) 格式化namenode,在node1上執行格式化操作:

        hdfs namenode -format

        格式化後必須啓動node1,否則NN2進行格式化會報錯

         hadoop-ademon.sh start namenode

 7) 在另外一個namenode上同步格式化,node2上執行如下命令:

         hdfs namenode -bootstrapStandby

 8)啓動zookeeper集羣,分別在node1,2,3上執行如下命令:

        zkServer.sh start

9)格式化zk,在node1上執行(必須在NN上執行)。如下命令:

       hdfs zkfc -formatZK

10) 啓動集羣 start-dfs.sh

11) 訪問頁面 http://node1:50070   http://node2:50070

     發現node1是active狀態,node2是standby狀態。

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章