1. 程式人生 > 實用技巧 >Hadoop高可用

Hadoop高可用

一、原因

  - NameNode是HDFS的黑心配置HDFS有事hadoop的核心元件 NameNode 在Hadoop及群眾至關重要

  - NameNode的宕機導致叢集的不可用

二、解決方案

  

  其中 NN表示兩臺 NameNode ZK表示 zookeeper(保持事務的一致性)

  兩種 1. HDFS with nfs 2. HDFS with QJM

  方案對比

  (一)都能實現熱備

  (二)都是一個Active NN一個 Stabdby NN

  (三)都是用zookeeper和zkfc來實踐自動失效恢復(事務一致)

  (四)失效切換都試用Fencin配置的方法來Active NN  

  (五)NFS資料共享變更方案把資料儲存在共享儲存裡,我們還需要考慮NFS的高可用

  (六)QJM不需要共享儲存 但需要讓內個DN都知道兩個NN的位置 並把塊資訊和心跳包傳送給Active和Standby這兩個NN

三、選擇QJM

  QJM不需要共享儲存,客戶端訪問NameNode1後,資料儲存完成,DataNode會返還給NameNode1資料儲存位置,這時就會生成fsimage檔案,那麼把返還的資料資訊給NameNode2一份 。fsedit資料變更日誌 NameNode1 把資料變成日誌記錄在 JNS 上(相當於MySQL的中繼日誌) NameNode2讀取JNS的資料(JNS可以做成高可用)

  (一)解決NameNode單點故障問題

  (二)Hadoop給出的HDFS的高可應用HA方案 HDFS通常有兩個NameNode組成 一個處於Active另一個處於Standby狀態 ACtive NameNode對外提供服務 比如處理來自客戶端的PRC請求 而 Standby NameNode 則不對外提供服務 僅同步 Active NameNode的狀態 以便能夠在失敗時能夠進行切換

  (三)高可用圖

    

    系統規劃圖(下面有nn01或則nn02即表示NameNode1 NameNode2)

        

  (四)安裝

  (1)配置 hosts 檔案並且傳給所有的機器

  (2)給nn02配置公鑰、私鑰(如果是新增的nn02那麼可以直接吧nn01的/root/.ssh/下的檔案直接複製過去)

  (3)安裝zookeeper叢集

  (4)配置Hadoop檔案

    1.core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>  #檔案系統
        <value>hdfs://hadoop</value> #因為是NameNode有兩臺所以這裡引用一個組的名字把這兩臺放在組中 這個組的名字不能全是數字
    </property>
    <property>
        <name>hadoop.tmp.dir</name> #資料檔案的存放目錄
        <value>/var/hadoop</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name> #宣告zookeeper
        <value>node1:2181,node2:2181,node3:2181</value>
    </property>
    <property>
        <name>hadoop.proxyuser.nfsuser.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.nfsuser.hosts</name>
        <value>*</value>
    </property>
</configuration>

    2.hadoop-env.sh   

export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre"  #大約在25行,宣告Java的安裝路徑

export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"  #大約在33行,生命Hadoop的安裝路徑

    3.hdfs-site.xml    

<property>
        <name>dfs.nameservices</name>  #宣告組 core-site.xml 在這個檔案中寫的什麼下面就要填什麼
        <value>hadoop</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.hadoop</name> #宣告組中的角色名字
    <value>nn1,nn2</value> <property> <name>dfs.namenode.rpc-address.hadoop.nn1</name> #組中nn1的機器是哪個 (rpc-address這兩個心跳關係) <value>nn01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.hadoop.nn2</name> #組中nn2的機器是哪個 <value>nn02:8020</value> </property> <property> <name>dfs.namenode.http-address.hadoop.nn1</name> #宣告NameNode nn1的機器 <value>nn01:50070</value> </property> <property> <name>dfs.namenode.http-address.hadoop.nn2</name> #宣告NameNode nn2的機器 <value>nn02:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> #宣告journalnode的節點(資料更變日誌) <value>qjournal://node1:8485;node2:8485;node3:8485/nsd1905</value> </property> <property> <name>dfs.journalnode.edits.dir</name> #宣告journalnode的資料存放目錄 <value>/var/hadoop/journal</value> </property> <property> <name>dfs.client.failover.proxy.provider.nsd1905</name> #宣告高可用的軟體 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> #宣告ssh <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> #宣告ssh的存放目錄 <value>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> #自動切換 <value>true</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.hosts.exclude</name> <value>/usr/local/hadoop/etc/hadoop/exclude</value> </property>

    4.mapred-site.xml

  <property>
        <name>mapreduce.framework.name</name>   #宣告管理方式
        <value>yarn</value>
    </property>

    5.slaves (宣告DateNode的節點)

node1
node2
node3

    6.yarn-site.xml

  <property>
        <name>yarn.resourcemanager.ha.enabled</name>  #開啟ha高可用
        <value>true</value>
    </property>
    <property> 
        <name>yarn.resourcemanager.ha.rm-ids</name>  #宣告rm的角色
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>  #開啟resourcemanage 高可用的軟體
        <value>true</value>
    </property>
  <property>
<name>yarn.resourcemanager.store.class</name> #yarn的資料儲存的一個類
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name> #宣告zookeeper地址
<value>node1:2181,node2:2181,node3:2181</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name> #宣告 id 組的名稱
<value>yarn-ha</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name> #宣告 rm1 對應的機器
<value>nn01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name> #宣告 rm2 對應的機器
<value>nn02</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

  (五)啟動服務

    (1)驗證zookeeper是否正常

    (2)同步配置到所有機器

    (3)初始化zookeeper叢集(在NameNode1上操作)

      /usr/local/hadoop/bin/hdfs zkfc -formatZK

    (4)啟動journalnode服務(node1 2 3 上操作)

      /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode 

    (5)NameNode1初始化

      /usr/local/hadoop//bin/hdfs namenode -format

    (6)同步配置到 NameNode2上(因為初始化之後生成檔案的id是唯一的所以只需要把檔案直接 上傳給NameNode2就行)

      rsync -aSH nn01:/var/hadoop/ /var/hadoop/

    (7)初始化JNS(NameNode1上操作)

      /usr/local/hadoop/bin/hdfs namenode -initializeSharedEdits

    (8)停止journalnode服務(在node 1 2 3 上操作)

      /usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode

    (9)啟動叢集(在NameNode1上操作)

      /usr/local/hadoop/sbin/start-all.sh

    (10)啟動熱備resourcemanager

      /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager

  (六)驗證服務

    (1)檢視叢集狀態(可以看到一個是active一個是standby)

      /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1

      /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn2

      /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1

      /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm2

    (2)檢視節點是否加入

      /usr/local/hadoop/bin/hdfs dfsadmin -report

    (3)訪問叢集

      /usr/local/hadoop/bin/hadoop fs -ls /

      /usr/local/hadoop/bin/hadoop fs -mkdir /aa

      /usr/local/hadoop/bin/hadoop fs -ls /

    (4)驗證高可用,關閉 active namenode (關閉之後再次檢視狀態會報錯)

      /usr/local/hadoop/sbin/hadoop-daemon.sh stop namenode

      /usr/local/hadoop/sbin/yarn-daemon.sh stop resourcemanager

    (5)恢復節點(回覆完在檢視)

      /usr/local/hadoop/sbin/hadoop-daemon.sh start namenode

      /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager