Hadoop HA

hadoop存在的兩個問題:

  1.內存受限的問題

    聯邦解決內存受限問題。node

    創建多個NameNode,每一個NameNode記錄元數據的一部分,可是對於元數據總體來講本質上仍是隻有一份。mysql

  2.單點故障

    HA(high available)高可用,解決hdfs的單點故障問題。sql

    主備namenode,存儲相同的數據,若是主NameNode發生故障,則切換到備用Namenode上。apache

手動HA:

   ActiveNameNode

     1.與客戶端創建鏈接,處理客戶端的請求,bootstrap

     2.向JNN寫入edits log文件,超過半數的JNN節點收到就行。服務器

  StandbyNameNode

       1.standbyNameNode會監視任何對edit log 的修改,一旦edits log出現更改,StandbyNameNode就會根據edits log更新本身的元數據網絡

    2.合併edits log和fsimage文件ssh

      合併的時機:1.一小時;2.超過1 000 000萬次事務(三秒鐘檢查一次事務數量)分佈式

    3.當ActiveNameNode發生故障轉移時,standbyNameNode主機會先確認本身已經讀取了JNS上的全部更改來同步自己的元數據,而後由Standby狀態切換爲Active狀態。ide

   DataNodes

      爲了確保在發生故障轉移時,NameNode擁有相同的數據塊位置信息,DNS向全部的NameNode發送數據塊位置信息和心跳數據。

   JNS

     JNs只容許一臺NameNode向JNs寫edits log數據,這樣就能保證不會發生「腦裂」。 

   手動HA

    經過命令實現主備之間的切換,能夠用在HDFS升級等場合

自動HA

  

 

 

 自動切換:

  基於zookeeper實現,zookeeper分佈式鎖實現統一時間只有一個namenode得到節點

 

  Zookeeper Failover Controller:監控namenode健康狀態,並向zookeeper註冊namenode

 

ZKFC:

  1.監控本機namenode的狀態

  2.與zookeeper創建鏈接,保持心跳

  3.當沒有active namenode的時候爲當前的namenode在zookeeper上搶佔臨時節點,得到節點爲activeNameNode

  4.若是當前的namenode不健康,讓zookeeper刪除臨時節點,讓對方搶佔

  5.若是zkfc退出,zookeeper臨時節點消失,對方搶佔 

 

Hadoop HA 的集羣搭建:

1.規劃

 

 

 

2.搭建步驟

 

a) 將zookeeper.tar.gz上傳到node二、node三、node4
b) 解壓到/opt
  tar -zxf zookeeper-3.4.6.tar.gz -C /opt
c) 配置環境變量:
  export ZOOKEEPER_PREFIX=/opt/zookeeper-3.4.6
  export PATH=$PATH:$ZOOKEEPER_PREFIX/bin
而後   . /etc/profile讓配置生效
d) 到$ZOOKEEPER_PREFIX/conf下
  複製zoo_sample.cfg爲zoo.cfg
  cp zoo_sample.cfg zoo.cfg
e) 編輯zoo.cfg
  添加以下行:
    server.1=node2:2881:3881
    server.2=node3:2881:3881
    server.3=node4:2881:3881

  修改
    dataDir=/var/bjsxt/zookeeper/data
f) 建立/var/bjsxt/zookeeper/data目錄,並在該目錄下放一個文件:myid
  在myid中寫下當前zookeeper的編號
  mkdir -p /var/bjsxt/zookeeper/data
  echo 3 > /var/bjsxt/zookeeper/data/myid


  2181 用戶客戶端鏈接zk集羣的端口
  zkCli.sh 客戶端啓動腳本
  zkServer.sh 服務端啓動腳本

  mysql -uroot -p123456
  mysqld 服務端

g) 將/opt/zookeeper-3.4.6經過網絡拷貝到node二、node3上
  scp -r zookeeper-3.4.6/ node2:/opt
  scp -r zookeeper-3.4.6/ node3:/opt
h) 在node2和node3上分別建立/var/bjsxt/zookeeper/data目錄,並在該目錄下放一個文件:myid
  node2:
    mkdir -p /var/bjsxt/zookeeper/data
    echo 1 > /var/bjsxt/zookeeper/data/myid
  node3:
    mkdir -p /var/bjsxt/zookeeper/data
    echo 2 > /var/bjsxt/zookeeper/data/myid

i) 啓動zookeeper
  zkServer.sh start 啓動zk
  zkServer.sh stop 中止zk
  zkServer.sh status 查看zk狀態
  zkServer.sh start|stop|status
j) 關閉zookeeper
  zkServer.sh stop
l) 鏈接zookeeper
  zkCli.sh node二、node三、node4均可以
m) 退出zkCli.sh命令
  quit

hadoop配置

一概在node1上操做,作完後scp到node二、node三、node4
hadoop-env.sh配置JDK

core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value> hdfs://node1:9000
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/var/bjsxt/hadoop/ha</value>
  </property>
  <!-- 指定每一個zookeeper服務器的位置和客戶端端口號 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>node2:2181,node3:2181,node4:2181</value>
  </property>
</configuration>

 

hdfs-site.xml

 

<configuration>
<!-- 指定block默認副本個數 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 用於解析fs.defaultFS中hdfs://mycluster中的mycluster地址 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- mycluster下面由兩個namenode服務支撐 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!--指定nn1的地址和端口號,發佈的是一個hdfs://的服務-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<!--指定三臺journal服務器的地址-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<!-- 指定客戶端查找active的namenode的策略:
會給全部namenode發請求,以決定哪一個是active的 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--在發生故障切換的時候,ssh到對方服務器,將namenode進程kill掉 kill -9 55767-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>

<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<!-- 指定journalnode在哪一個目錄存放edits log文件 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/bjsxt/hadoop/ha/jnn</value>
</property>
<!--啓用自動故障切換-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

</configuration>

 

啓動ha的hadoop先同步配置文件到node二、node三、node4

  scp -r $HADOOP_HOME/etc/hadoop/* node[234]:/opt/hadoop-2.6.5/etc/hadoop/

0)啓動zookeeper集羣
a) 在node1\node2\node3上啓動三臺journalnode
  hadoop-daemon.sh start journalnode
b) 任意選擇node1,格式化HDFS
  hdfs namenode -format
 格式化後,啓動namenode進程
  hadoop-daemon.sh start namenode
c) 在另外一臺node2上同步元數據
  hdfs namenode -bootstrapStandby

d) 初始化zookeeper上的內容 必定是在namenode節點上。
  hdfs zkfc -formatZK

e) 啓動hadoop集羣,可在node1到node4這四臺服務器上任意位置執行
  start-dfs.sh
  stop-dfs.sh中止hadoop服務。

zookeeper操做


  在node2或者node3或者node4上運行
  zkCli.sh

  ls /hadoop-ha/mycluster 查看臨時文件
  get /hadoop-ha/mycluster/ActiveStandbyElectorLock 查看臨時文件的內容

  退出zkCli.sh
  quit


  hdfs dfs -mkdir /user
  hdfs dfs -mkdir /user/root
  /user/root是用戶root家目錄

中止集羣:


首先
  stop-dfs.sh
其次,中止zookeeper集羣
  node二、node三、node4上執行:
  zkServer.sh stop

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

相關文章
相關標籤/搜索