3.配置HDFS HA

namenode負責管理整個hdfs集羣,若是namenode故障則集羣將不可用.所以有必須實現namenode高可用.
hdfs的高可用原理參考:
HADOOP(二):hdfs 高可用原理
zookeeper簡介:
zookeeper集羣安裝node

安裝zookeeper

下載zookeeper

下載zookeeper並解壓到/optweb

[zookeeper@hadoop1 opt]$ wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
[zookeeper@hadoop1 opt]$ gunzip zookeeper-3.4.9.tar.gz
[zookeeper@hadoop1 opt]$ tar -xvf zookeeper-3.4.9.tar.gz

編輯zookeeper配置文件

[zookeeper@hadoop1 zookeeper-3.4.9]$ cd conf/
[zookeeper@hadoop1 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[zookeeper@hadoop1 conf]$ cp zoo_sample.cfg zoo.cfg
[zookeeper@hadoop1 conf]$ vi zoo.cfg
tickTime=2000
dataDir=/opt/zookeeper-3.4.9/dataDir
dataLogDir=/opt/zookeeper-3.4.9/dataLogDir
clientPort=2181
initLimit=5
syncLimit=2
server.1=hadoop3:2888:3888
server.2=hadoop4:2888:3888
server.3=hadoop5:2888:3888

建立myid文件

在每一個節點上寫上節點的id,如節點1就寫1.放在dataDir指定的目錄下.docker

啓動zookeeper

bin/zkServer.sh start

若是報錯檢查zookeeper.outshell

使用客戶端鏈接到zookeeper:apache

[zookeeper@hadoop5 zookeeper-3.4.9]$ bin/zkCli.sh -server 127.0.0.1:2181

連進去表示zookeeper正常bootstrap

配置HDFS HA

配置手動HA

HDFS HA中用,nameserivce ID來標識一個HDFS服務,爲了標識每一個NN,還要加上namenode id。
hdfs-site.xml中:
1.設置集羣的標識dfs.nameservice安全

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>

這裏修改成dockerclusterdom

2.設置namenode名稱 dfs.ha.namenodes.[nameservice ID]ssh

<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>

nn1 nn2爲namenode的標識。
注意:當前只支持兩個namenode的HAide

3.設置namenode對外提供服務的RPC地址 dfs.namenode.rpc-address.[nameservice ID].[name node ID]

<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>hadoop1:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>hadoop2:8020</value>
</property>

這個RPC地址實際就是 dfs.defaultFS地址

4.設置HDFS web頁面地址 dfs.namenode.http-address.[nameservice ID].[name node ID]

<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>hadoop1:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>hadoop2:50070</value>
</property>

若是啓用的hdfs的安全機制,要設置 https-address

5.設置journal上edit log共享目錄 dfs.namenode.shared.edits.dir
格式是:qjournal://host1:port1;host2:port2;host3:port3/journalId 全部節點上路徑要保持一致

<property>
 <name>dfs.namenode.shared.edits.dir</name>
 <value>qjournal://hadoop3:8485;hadoop4:8485;hadoop5:8485/mycluster</value>
</property>

這裏咱們改爲: qjournal://hadoop4:8485;hadoop5:8485;hadoop6:8485/dockercluster

6.設置實現集羣HA的類 dfs.client.failover.proxy.provider.[nameservice ID]

<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

當前僅支持這個類

7.設置切換時執行的程序 dfs.ha.fencing.methods
當namenode發生切換時,原來active的NN可能依然在寫edit log,這時若是standby 也開始寫edit log,元數據會"腦裂"。爲了防止"腦裂",必需要切換以前殺掉原來active 的NN,這個腳本就是實現這個目的。當前支持兩中fencing.method:shell 和 sshfence。另外,可能自定義org.apache.hadoop.ha.NodeFence來實現本身的保護程序。

7.1.sshfence(默認)
經過SSH登陸到原來active的NN,並使用fuser命令KILL掉NN進程。要使用SSH,必須配置rsa-key參數:dfs.ha.fencing.ssh.private-key-files

<property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>

    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/hdfs/.ssh/id_rsa</value>
    </property>

也能夠用其它用戶登陸,一樣能夠配置超時參數:

<property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence([[username][:port]])</value>
    </property>
    <property>
      <name>dfs.ha.fencing.ssh.connect-timeout</name>
      <value>30000</value>
    </property>

7.2.shell
自定義一個shell腳本業殺死NAMENODE

<property>
      <name>dfs.ha.fencing.methods</name>
      <value>shell(/path/to/my/script.sh arg1 arg2 …)</value>
    </property>

shell腳本能夠讀取到當前已經配置的HDFS變量,將"."替換爲"_" 便可。對於某些共用的條目,如dfs_namenode_rpc-address能夠自動的指向特定節點如dfs.namenode.rpc-address.ns1.nn1。如下變量也能夠使用:

$target_host
$target_port
$target_address
$target_namenodeid

示例:

<property>
      <name>dfs.ha.fencing.methods</name>
      <value>shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)</value>
    </property>

若是shell返回0,表示執行成功。若是不爲0,則繼續執行其它的fencing.method.shell方式沒有timeout.

這時裏,咱們也用ssh方式,比較簡單,只須要生成key就好了.在NN1 NN2上執行:

[hdfs@hadoop1 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hdfs/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hdfs/.ssh/id_rsa.
Your public key has been saved in /home/hdfs/.ssh/id_rsa.pub.
The key fingerprint is:
6b:de:13:b7:55:ba:43:1c:28:ef:2e:b8:b7:0a:e0:15 hdfs@hadoop1
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|      E      .   |

8.journal節點守護進程本身的數據目錄 dfs.journalnode.edits.dir

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/opt/hadoop-2.8.0/journalEditDir</value>
</property>

9.在core-site.xml中設置hdfs 服務 fs.defaultFS
一旦使用了HDFS HA,那麼fs.defaultFS就不能寫成host:port文件,而要寫成服務方式,寫上nameservice id:

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>

這裏改爲hdfs://dockercluster

通過以上的配置,能夠經過命令手動切換nemenode

配置自動HA

1.修改hdfs-site.xml
添加:

<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>

2.修改core-site.xml
添加zookeer的server列表:

<property>
   <name>ha.zookeeper.quorum</name>
   <value>hadoop3:2181,hadoop4:2181,hadoop5:2181</value>
 </property>

啓動HDFS HA

1.在zookeeper中初始化HA狀態
在其中一臺namenode上執行:

[hdfs]$ $HADOOP_PREFIX/bin/hdfs zkfc -formatZK

2.啓動HDFS集羣

1.啓動全部journal節點`$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode`
2.執行journal 節點初始化`hdfs namenode -initializeSharedEdits`
3.啓動原來的namenode `$HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode`
4.初始化standby,在standby上執行 `hdfs namenode -bootstrapStandby`,
5.啓動standby `$HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode`
6.啓動namenode自動HA進程zkfc,在每臺namenode上執行:$HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc

3.檢查HA狀況


能夠看到兩臺機器一個是active一個是standby

4.驗證自動HA
如今在hadoop1 kill active的namenode

發現hadoop2成了active,說明自動HA配置成功.



相關文章
相關標籤/搜索