第二十天 – zookeeper – hadoop高可用搭建 – hadoop高可用恢復原資料

一、ZooKeeper

簡介

ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,它是叢集的管理者,監視著叢集中各個節點的狀態根據節點提交的反饋進行下一步合理操作。最終,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者,ZooKeeper提供了檔案系統和通知機制。ZooKeeper的檔案系統類似於Linux的樹形結構,但有它獨特的地方,如一個節點既是一個目錄,又是一個檔案,即節點可以儲存資料,也可以在其中儲存子節點。ZooKeeper的作用有:配置資訊管理、名稱空間管理、叢集的管理、組服務管理等。

下載
安裝

將下載的安裝包上傳至Linux,解壓即可

配置ZooKeeper

ZooKeeper叢集也分為單機、偽分佈、全分佈安裝,這裡直接配置全分佈安裝。

  1. 進入ZooKeeper安裝目錄的conf資料夾,將zoo_sample.cfg重新命名為zoo.cfg或者直接新建檔案zoo.cfg。zoo.cfg配置如下

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/home/bigdata/zkdata #此為ZooKeeper的資料存放目錄
    clientPort=2181 #此為ZooKeeper的訪問埠
    dataLogDir=/home/bigdata/zkdata/log #此為ZooKeeper的日誌存放目錄
    #以下三項配置叢集的主機資訊,2888是從follower連線到leader機器的埠,3888用來進行leader選舉時所用的埠
    server.1=sz01:2888:3888 
    server.2=sz02:2888:3888
    server.3=sz03:2888:3888
    
  2. 在第一臺/home/bigdata/zkdata中建立檔案myid,檔案內容為1,在第二臺/home/bigdata/zkdata中建立檔案myid,檔案內容為2,在第一臺/home/bigdata/zkdata中建立檔案myid,檔案內容為3。檔案內容要與zoo.cfg中server.後面的數字相對應

配置環境變數

vi .bash_profile 檔案中新增一下資訊

ZK_HOME=/home/bigdata/zookeeper-3.4.13/

PATH=$PATH:$ZK_HOME/bin

export ZK_HOME

儲存退出後source .bash_profile

分發ZooKeeper至另外兩臺

使用scp命令將ZooKeeper安裝目錄、環境變數檔案分發至另外兩臺機器對應的使用者目錄中

scp -r /home/bigdata/zookeeper-3.4.13 SZ02:/home/bigdata/zookeeper-3.4.13

scp -r /home/bigdata/zookeeper-3.4.13 SZ03:/home/bigdata/zookeeper-3.4.13

啟動ZooKeeper

啟動ZooKeeper服務

檢視狀態時,有一臺是leader,另外兩臺是follower

可以使用zkCli.sh進入ZooKeeper的命令列進行操作ZooKeeper的檔案系統

zkCli的基本命令

建立節點

create [-s][-e] path data acl

如create /node1 123:在根目錄建立了node1節點,並攜帶資料 123

引數-e代表建立臨時節點,僅在當前session有效,退出後建立的節點就消失了

引數-s代表建立序列化節點,如create -s /node2 111,實際建立的節點名為node2_10000000001,如果重複建立,則後面的數字會遞增。

刪除操作

delete path :刪除節點資料,無法刪除包含子節點的節點

rmr path :刪除整個節點

修改操作

set path data

檢視節點資料

get path

ZooKeeper注意事項

zookeeper叢集需要奇數臺server,叢集中有半數以上的節點存活即可正常使用。

zookeeper快速選舉機制:當叢集中leader掛掉,所有follower會投票選舉出新的leader。

快速同步資料:zookeeper將會儲存小量用於服務做協調的資料,並且同步資料屬於強一致性,即快速同步資料。

二、Hadoop高可用

高可用的目的是解決單點故障,如hdfs中的namenode節點宕機,需要立即啟用另外的namenode接管叢集。更具體的含義、介紹可以檢視官網介紹,本文只講解如何搭建。HDFS、YARN可以搭建高可用環境

高可用節點規劃
SZ01 NameNode DataNode ResourceManager NodeManager JournalNode zkfc QuorumPeerMain
SZ02 NameNode DataNode ResourceManager NodeManager JournalNode zkfc QuorumPeerMain
SZ03 DataNode NodeManager JournalNode QuorumPeerMain
配置ssh免密登入
修改配置檔案

在非高可用的基礎上,修改hadoop安裝目錄下的./etc/hadoop/目錄中的如下配置檔案

  1. core-site.xml

    <configuration>
    <!--指定高可用叢集名稱空間-->
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://bigdata</value>
    </property>
    <!-- Hadoop檔案系統依賴的基礎配置 -->
    <property>
      <name>hadoop.tmp.dir</name>
     <value>/home/hahadoopdata/tmp</value>
    </property>
    <property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
    </property>
    <!--指定zk叢集的地址-->
    <property>
     <name>ha.zookeeper.quorum</name>
     <value>SZ01:2181,SZ02:2181,SZ03:2181</value>
    </property>
    </configuration>
    
  2. hdfs-site.xml

    <configuration>
    <!--設定hdfs副本數-->
    <property>
     <name>dfs.replication</name>
     <value>3</value>
    </property>
    <!--指定檔案塊大小-->
    <property>
     <name>dfs.block.size</name>
     <value>134217728</value>
    </property>
    <!--指定namenode資料存放目錄-->
    <property>
     <name>dfs.namenode.name.dir</name>
     <value>/home/bigdata/hahadoopdata/dfs/name</value>
    </property>
    <!--指定datanode資料存放目錄-->
    <property>
     <name>dfs.datanode.data.dir</name>
     <value>/home/bigdata/hahadoopdata/dfs/data</value>
    </property>
    <!--指定hdfs命名服務的邏輯名稱,需要與fs.defaultFS設定相同-->
    <property>
     <name>dfs.nameservices</name>
     <value>bigdata</value>
    </property>
    <!--指定namenode別名-->
    <property>
      <name>dfs.ha.namenodes.bigdata</name>
      <value>nn1,nn2</value>
    </property>
    <!--指定namenode主機及埠-->
    <property>
      <name>dfs.namenode.rpc-address.bigdata.nn1</name>
      <value>sz01:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.bigdata.nn2</name>
      <value>sz02:8020</value>
    </property>
    <!--指定namenodeWeb監控埠-->
    <property>
      <name>dfs.namenode.http-address.bigdata.nn1</name>
      <value>sz01:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.bigdata.nn2</name>
      <value>sz02:50070</value>
    </property>
    <!--指定namenode讀寫journalnode埠地址-->
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://sz01:8485;sz02:8485;sz03:8485/bigdata</value>
    </property>
    <!--指定journalnode資料存放目錄-->
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/home/bigdata/hahadoopdata/journal/data</value>
    </property>
    <!--是否開啟namenode宕機後自動切換-->
    <property>
      <name>dfs.ha.automatic-failover.enabled</name>
      <value>true</value>
    </property>
    <!--指定namenode宕機後自動切換主類-->
    <property>
     <name>dfs.client.failover.proxy.provider.bigdata</name>
     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!--指定namenode宕機後殺死該namenode的方式,防止腦裂-->
    <property>
     <name>dfs.ha.fencing.methods</name>
     <value>sshfence</value>
    </property>
    <!--ssh的公鑰存放位置-->
    <property>
     <name>dfs.ha.fencing.ssh.private-key-files</name>
     <value>/home/bigdata/.ssh/id_rsa</value>
    </property>
    <!--指定ssh登入的延遲時間-->
    <property>
     <name>dfs.ha.fencing.ssh.connect-timeout</name>
     <value>30000</value>
    </property>
    </configuration>
    
  3. mapred-site.xml

    <configuration>
    <!--配置MapReduce任務的執行框架-->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    <final>true</final>
    </property>
    </configuration>
    
    
  4. yarn-site.xml

    <configuration>
    <!--NodeManager上執行的附屬服務。需配置成mapreduce_shuffle,才可執行MapReduce程式-->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <!--是否開啟yarn的高可用-->
    <property>
      <name>yarn.resourcemanager.ha.enabled</name>
      <value>true</value>
    </property>
    <!--指定yarn叢集id-->
    <property>
      <name>yarn.resourcemanager.cluster-id</name>
      <value>bigdatayarn</value>
    </property>
    <!--指定高可用兩臺resourcemanager別名-->
    <property>
      <name>yarn.resourcemanager.ha.rm-ids</name>
      <value>rm1,rm2</value>
    </property>
    <!--指定兩臺resourcemanager主機名-->
    <property>
      <name>yarn.resourcemanager.hostname.rm1</name>
      <value>sz01</value>
    </property>
    <property>
      <name>yarn.resourcemanager.hostname.rm2</name>
      <value>sz02</value>
    </property>
    <!--指定resourcemanagerWeb監控埠-->
    <property>
      <name>yarn.resourcemanager.webapp.address.rm1</name>
      <value>sz01:8088</value>
    </property>
    <property>
      <name>yarn.resourcemanager.webapp.address.rm2</name>
      <value>sz02:8088</value>
    </property>
    <!--指定zk叢集的地址-->
    <property>
      <name>yarn.resourcemanager.zk-address</name>
      <value>sz01:2181,sz02:2181,sz03:2181</value>
    </property>
    <property>
      <name>yarn.nodemanager.resource.memory-mb</name>
      <value>1024</value>
    </property>
    <property>
      <name>yarn.nodemanager.resource.cpu-vcores</name>
      <value>1</value>
    </property>
    </configuration>
    
  5. slaves

    sz01
    sz02
    sz03
    
分發配置檔案

scp -r $HADOOP_HOME/etc/hadoop sz02:$HADOOP_HOME/etc/hadoop
scp -r $HADOOP_HOME/etc/hadoop sz03:$HADOOP_HOME/etc/hadoop

第一次啟動高可用叢集
  1. 三臺機器啟動journalnode節點

注意:在進行第三步操作前,請先閱讀下文第三大點高可用叢集恢復原資料

  1. 選擇第一臺namenode進行格式化,然後單節點啟動

    hdfs namenode -format

  2. 另一臺namenode進行拉取元資料

    hdfs namenode -bootstrapStandby

  3. 格式化zkfc

    hdsf zkfc -formatZK

格式化過程可能會不同的報錯,通過檢視日誌可解決,一般都是防火牆未關閉、配置檔案未配置正確等問題。

啟動叢集

第二臺的resourcemanager可能無法自動啟動,需要通過單臺啟動命令啟動

啟動完成後,三臺節點的程序如下圖

1540000409061

三、高可用叢集恢復原資料

搭建高可用集群后,由於配置檔案中一些配置目錄的改變,並且格式化了namenode,整個hdfs中的資料是空的,將會導致一些問題,比如hive無法正常操作,原表資料無法查詢等。此時需要回復原叢集中的資料。

恢復原資料

兩種思路:1.如果在上文第一次啟動高可用叢集進行到第2步,還未進行namenode的格式化,可以嘗試如下方法(本方法我未測試,但是思路理論上行得通):直接修改配置檔案core-site.xml的hadoop.tmp.dir配置項和hdfs-site.xml中的namenode、datanode為原叢集中的資料目錄,然後直接跳過第3步的格式化namenode,直接單節點啟動namenode後進行第4步

2.如果剛開始沒有想過要回復元資料,已經走完了整個第一次啟動高可用叢集的流程,然後想回復原資料,此時就需要比較繁瑣的步驟了,如下。

  • 修改hdfs-site.xml中的namenode、datanode為原叢集中的資料目錄,journalnode的資料目錄可不修改。

  • 檢視/home/bigdata/hadoop/dfs/name/current目錄下(原叢集中的namenode資料存放目錄)的VERSION檔案,記錄clusterID後的值

  • 修改/home/bigdata/hahadoopdata/journal/data/bigdata/current目錄下(新叢集中的journalnode資料存放目錄)下的VERSION檔案,將clusterID後的字串修改為上一步記錄的值。注意:三臺journalnode都需要進行這一步操作

  • 為了保險起見,檢查三臺datanode節點的VERSION檔案的clusterID是否與namenode一致

  • 都修改完成後,進行第二臺另namenode進行拉取元資料、格式化zkfc的操作

  • 注意,啟動hdfs後如果無法啟動namenode,檢視日誌檔案如果出現類似There appears to be a gap in the edit log. We expected txid 1, but got txid 1622的報錯,意為元資料損壞,此時使用命令恢復原資料即可

    hadoop namenode -recover

hive恢復表資料

回覆完hdfs的資料後,檔案資料雖然都已經回覆了,但是hive依舊無法進行正常的增刪改查操作,原因是叢集的命名改變了,而hive的元資料資訊沒變,此時需要手動在mysql中修改hive的元資料資訊。

需要修改兩張表

DBS表和SDS表

原資訊:hdfs://sz01:8020/user/hive/warehouse/xxxxx

修改後:hdfs://bigdata/user/hive/warehouse/xxxxx

修改後即可正常使用了。