BigData~03:Hadoop05 ~ HA叢集搭建

weixin_34138377發表於2018-07-26

Hadoop是一個環境敏感的框架,在Win和類Unix上安裝的差別較大,但是一般我們都在Linux上進行安裝,這裡安裝的版本為2.6.4,apache提供的hadoop-2.6.4的安裝包是在32位作業系統編譯的,因為hadoop依賴一些C++的本地庫,所以如果在64位的操作上安裝hadoop-2.6.4就需要重新在64作業系統上重新編譯;

一、環境準備

  • 修改主機名,修改IP,新增主機名和IP的對映關係(/etc/hosts),配置免密登入,配置防火牆(也可以直接關閉);
  • 安裝JDK和配置環境變數;

二、叢集安裝規劃

  • 由於是HA叢集,所以牽扯到的機器比以前稍多幾臺,當然也可以共用,提前做好叢集的安裝規劃還是比較好的選擇:
    主機名 規劃IP 要安裝軟體 該執行的程式
    hdp1 192.168.70.130 JDK、hadoop NameNode、DFSZKFailoverController
    hdp2 192.168.70.131 JDK、hadoop NameNode、DFSZKFailoverController(zkfc)
    hdp3 192.168.70.132 JDK、hadoop ResourceManager
    hdp4 192.168.70.133 JDK、hadoop ResourceManager
    hdp5 192.168.70.135 JDK、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
    hdp6 192.168.70.136 JDK、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
    hdp7 192.168.70.137 JDK、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
  • 注意:
    1. 在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby狀態的NameNode則不對外提供服務,僅同步Active狀態的NameNode的狀態,以便能夠在它失敗時快速進行切換。hadoop2.0官方提供了兩種HDFS的HA解決方案,一種是NFS,另一種是QJM。這裡我們使用簡單的QJM。對於QJM,主備NameNode之間通過一組JournalNode同步後設資料資訊,一條資料只要成功寫入多數JournalNode即認為寫入成功,所以通常配置奇數個JournalNode;這裡還配置了一個ZooKeeper叢集,用於ZKFC(DFSZKFailoverController)故障轉移,當Active狀態的NameNode掛掉了,會自動切換Standby狀態的NameNode為Standby狀態;
    2. hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調;

三、開始安裝

  1. 安裝ZooKeeper叢集:
    • 解壓tar.gz安裝包:tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local/apps
    • 修改配置:
      • 進入ZK的安裝目錄(後面簡稱:<ZK_HOME>)的conf資料夾:cp zoo_sample.cfg zoo.cfg
      • zoo.cfg檔案最後新增
        1. 資料輸出目錄dataDir=<your-hdp-data-dir>,預設是在/tmp資料夾下,不安全,並確保這個資料夾存在;
        2. 節點間的關係,以及通訊介面:
          server.1=hdp5:2888:3888
          server.2=hdp6:2888:3888
          server.3=hdp7:2888:3888
          
      • 把配置好的hadoop安裝目錄拷貝到hdp6和hdp7:
        scp -r <ZK_HOME>/zookeeper-3.4.5/hdp6:<ZK_HOME>
        scp -r <ZK_HOME>/zookeeper-3.4.5/hdp7:<ZK_HOME>
        
      • 並把節點編號寫入各自節點資料輸出目錄的myid目錄,這裡的節點編號分別是:1,2,3:
        echo <num> > <your-hdp-data-dir>/myid
        
  2. 安裝Hadoop叢集:
    • 解壓hadoop-2.6.4.tar.gz
    • 配置環境變數,包括根路徑(HADOOP_HOME)和bin;
    • 修改配置檔案,這些配置檔案全部位於<HADOOP_HOME>/etc/hadoop目錄下:
      • 在hadoo-env.sh檔案中新增JAVA_HOME
        export JAVA_HOME=<your-java-home>
        
      • 修改core-site.xml,在最後新增:
        <configuration>
            <property>
                <name>fs.defaultFS</name>
                <value>hdfs://ns/</value>
                <description>指定hdfs的nameservice為ns</description>
            </property>
            <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/hadoop/app/hdpdata/</value>
                <description>指定hadoop臨時目錄</description>
            </property>
            <property>
                <name>ha.zookeeper.quorum</name>
                <value>hdp5:2181,hdp6:2181,hdp7:2181</value>
                <description>指定zookeeper地址</description>
            </property>
        </configuration>
        
      • 修改hdfs-site.xml,在最後新增:
        <configuration>
            <property>
                <name>dfs.nameservices</name>
                <value>ns</value>
                <description>指定hdfs的nameservice為ns,需要和core-site.xml中的保持一致</description>
            </property>
            <property>
                <name>dfs.ha.namenodes.ns</name>
                <value>nn1,nn2</value>
                <description>ns下面有兩個NameNode,分別是nn1,nn2</description>
            </property>
            <property>
                <name>dfs.namenode.rpc-address.ns.nn1</name>
                <value>hdp1:9000</value>
                <description>nn1的RPC通訊地址</description>
            </property>
            <property>
                <name>dfs.namenode.http-address.ns.nn1</name>
                <value>hdp1:50070</value>
                <description>nn1的http通訊地址</description>
            </property>
            <property>
                <name>dfs.namenode.rpc-address.ns.nn2</name>
                <value>hdp2:9000</value>
                <description>nn2的RPC通訊地址</description>
            </property>
            <property>
                <name>dfs.namenode.http-address.ns.nn2</name>
                <value>hdp2:50070</value>
                <description>nn2的http通訊地址</description>
            </property>
            <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://hdp5:8485;hdp6:8485;hdp7:8485/ns</value>
                <description>指定NameNode的edits後設資料在JournalNode上的存放位置</description>
            </property>
            <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/home/hdp5/journaldata</value>
                <description>指定JournalNode在本地磁碟存放資料的位置</description>
            </property>
            <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
                <description>開啟NameNode失敗自動切換</description>
            </property>
            <property>
                <name>dfs.client.failover.proxy.provider.ns</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
                <description>配置失敗自動切換實現方式</description>
            </property>
            <property>
                <name>dfs.ha.fencing.methods</name>
                <value>
                sshfence
                shell(/bin/true)
                </value>
                <description>配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行</description>
            </property>
            <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/home/shreker/.ssh/id_rsa</value>
                <description>使用sshfence隔離機制時需要ssh免登陸</description>
            </property>
            <property>
                <name>dfs.ha.fencing.ssh.connect-timeout</name>
                <value>30000</value>
                <description>配置sshfence隔離機制超時時間</description>
            </property>
        </configuration>
        
      • 修改mapred-site.xml,在最後新增:
        <configuration>
            <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
                <description>指定MR資源排程框架為yarn</description>
            </property>
        </configuration>  
        
      • 修改yarn-site.xml,在最後新增:
        <configuration>
            <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
                <description>開啟RM高可用</description>
            </property>
            <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>yrc</value>
                <description>指定RM的cluster id</description>
            </property>
            <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
                <description>指定RM的名字</description>
            </property>
            <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>hdp3</value>
                <description>指定RM的地址</description>
            </property>
            <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>hdp4</value>
                <description>指定RM的地址</description>
            </property>
            <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>hdp5:2181,hdp6:2181,hdp7:2181</value>
                <description>指定zk叢集地址</description>
            </property>
            <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
                <description>指定服務名稱</description>
            </property>
        </configuration>
        
      • 指定當前節點的子節點,修改slaves檔案:
        hdp5
        hdp6
        hdp7
        
  3. 分發配置好的Hadoop到後面的機器:
    scp -r <local-hadoop-home-dir> <user>@<host>:<target-parent-dir>
    
  4. 啟動叢集
    • 在hdp5、hdp6、hdp7上啟動zookeeper叢集:
      zkServer.sh start
      
    • 在hdp5、hdp6、hdp7上啟動JournalNode:
      hadoop-daemon.sh start journalnode
      
    • 分別在ns的nn1和nn2上初始化HDFS的NameNode,注意兩個cluster-id必須一致,完成之後就會把後設資料拷貝到對應的StandBy的機器上:
      hdfs namenode -format -clusterID <your-cluster-id>
      
    • 初始化ZKFC操作:
      hdfs zkfc -formatZK
      
    • 啟動HDFS(根據規劃在hdp1上執行):
      start-dfs.sh
      
    • 啟動YARN(為了效能把NameNode和ResourceManager放在不同的機器上,選擇hdp2):
      start-yarn.sh
      

四、驗證測試

  1. 訪問瀏覽器:http://hdp1:50070http://hdp2:50070
  2. 驗證HA
    • 上傳檔案;
    • 瀏覽器訪問,如1;
    • 幹掉hdp1上Active的NameNode:kill -9 <nn-pid>
    • 瀏覽器訪問,如1,發現hdp2上NameNode的狀態已經切換為Active;
    • 啟動剛才幹掉的NameNode,狀態切換為StandBy;

五、常用叢集測試命令

  1. 檢視hdfs的各節點狀態資訊
    hdfs dfsadmin -report
    
  2. 獲取一個NameNode節點的HA狀態
    hdfs haadmin -getServiceState nn1
    
  3. 單獨啟動一個NameNode程式
    hadoop-daemon.sh start namenode
    
  4. 單獨啟動一個zkfc程式
    hadoop-daemon.sh start zkfc
    

相關文章