hadoop ha 高可用搭建

該ha搭建是在hadoop全分佈式基礎上搭建,關於hadoop全分佈式搭建可以參考另一篇hadoop3分佈式環境基礎搭建

目錄

一、高可用簡介

二、配置hadoop

三、zookeeper安裝及配置

四、namenode節點信息同步

五、zookeeper格式化、ha啓動及測試


一、高可用簡介

多個namenode,增加namenode增加可用性。

ha角色分配如下

NN:namenode;                         DN:datanode;

ZK:zookeeper;                         ZKFC:ZookeeperFailoverController;

JNN:journalnode;

二、配置hadoop

說明:使用時請將#開頭的註釋刪除,因爲有的配置文件的註釋不爲#!

注意:ha高可用搭建是在全分佈式基礎上搭建的,基本相似,本節只列舉了配置中不同的地方。關於全分佈式搭建請看這裏hadoop3分佈式環境基礎搭建

配置hadoop環境變量

vi /myapp/hadoop-3.1.2/etc/hadoop/hadoop-env.sh 

在最後一行添加如下內容(JAVA_HOME根據實際JAVA安裝路徑決定):

export JAVA_HOME=/export/servers/jdk             # JAVA_HOME路徑,可用echo $JAVA_HOME獲得
export HDFS_NAMENODE_USER=root                   # 爲hadoop配置三個角色的用戶
export HDFS_DATENODE_USER=root
# export HDFS_SECONDARYNAMEDODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root

配置副本放置策略

vi /myapp/hadoop-3.1.2/etc/hadoop/hdfs-site.xml 

hdfs-site.xml中configuration標籤內容修改如下:

<configuration>
<!-- 配置放置的副本數(存於datanode中,且不會在同一機器上) -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>               
    </property>

<!-- 配置本機的邏輯名稱,指向實際namenode節點(因爲有多個namenode) -->
    <property>
        <name>dfs.nameservices</name>   
        <value>mycluster</value>
    </property>
<!-- 配置‘mycluster’的namenode,nn1,nn2,nn3爲namenode名 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name> 
        <value>nn1,nn2,nn3</value>
    </property>
<!-- 對應上面兩個namenode(nn1,nn2)配置 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>  
  <value>node01:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:8020</value>
</property>

<!-- nn1,nn2的http協議配置(上面兩個) -->
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name> 
  <value>node01:9870</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:9870</value>
</property>

<!-- journalnode配置,有三個分別是node01,node02,node03(由第一節架構圖可知) -->
<property>      
  <name>dfs.namenode.shared.edits.dir</name>
 <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>

<!-- 配置故障轉移代理,直接複製官網上的,不需要改變 -->
<property>    
  <name>dfs.client.failover.proxy.provider.mycluster</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 由於namenode之間的切換需要操縱遠程電腦,所以配置私有免祕鑰訪問 -->
    <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_rsa</value> 
    </property>

<!--  配置journalnode的日誌所在路徑,在此配置與hadoop配置目錄(/myapp/hadoop-3.1.2/ha_temp/)下 -->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/myapp/hadoop-3.1.2/ha_temp/journalnode</value>
</property>

<!--  配置故障轉移 -->
 <property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>

</configuration>

配置主節點

vi /myapp/hadoop-3.1.2/etc/hadoop/core-site.xml 

 core-site.xml中configuration標籤內容修改如下:

<configuration>

<!-- 配置的主節點namenode,由於有多個,所以爲namenode服務的名稱 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>       
    </property>

<!-- 自定義hadoop的臨時目錄,不修改爲系統臨時目錄,容易丟失,比較危險 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/myapp/hadoop-3.1.2/ha_temp</value>   
    </property>

<!-- 配置zookeeper集羣,由第一節架構圖可知有三個node02,node03,node04 -->
 <property>
   <name>ha.zookeeper.quorum</name>
   <value>node02:2181,node03:2181,node04:2181</value>
 </property>

</configuration>

將配置分發到其他節點

scp core-site.xml hdfs-site.xml hadoop-env.sh root@node02:/myapp/hadoop-3.1.2/etc/hadoop/
scp core-site.xml hdfs-site.xml hadoop-env.sh root@node03:/myapp/hadoop-3.1.2/etc/hadoop/
scp core-site.xml hdfs-site.xml hadoop-env.sh root@node04:/myapp/hadoop-3.1.2/etc/hadoop/

配置從節點

參考全分佈式。

三、zookeeper安裝及配置

zookeeper要安裝到node02、node03、node04上。

採取策略:現在node02上安裝配置好,然後分發到node03、node04上去。

解壓

tar -xzvf zookeeper-3.4.6.tar.gz -C /myapp/

配置zookeeper環境變量(node02、node03、node04都要做這步)

vi /etc/profile,在末尾添加:

#set zookeeper env
export ZOOKEEPER_HOME=/myapp/zookeeper-3.4.6
export PATH=${ZOOKEEPER_HOME}/bin:$PATH

重新加載環境變量

source /etc/profile

配置zookeeper

1)修改zoo.cfg

將conf目錄中zoo_sample.cfg重命名爲zoo.cfg,不做這一步可能無法正常啓動,命令如下:

mv /myapp/zookeeper-3.4.6/conf/zoo_sample.cfg /myapp/zookeeper-3.4.6/conf/zoo_.cfg 

用 vi zoo.cfg 命令修改zoo.cfg文件

將dataDir改爲如下,dataDir爲zookeeper的臨時目錄,默認放在系統臨時目錄/tmp下,容易丟失

dataDir=/myapp/zookeeper-3.4.6/temp

添加如下內容到zoo.cfg末尾,即將zookeeper集羣中的所有節點配置,對應關係很重要,配置後不要修改

server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888

2)將zoo.cfg分發到node03、node04

在hadoop安裝目錄的上級目錄執行下面命令

scp -r zookeeper-3.4.6 root@node03:/myapp/
scp -r zookeeper-3.4.6 root@node04:/myapp/

3)對zookeeper的每臺機器配置編號(node02、node03、node04)

創建zookeeper的臨時目錄,即zoo.cfg中dataDir指定的那個目錄

mkdir -p /myapp/zookeeper-3.4.6/temp

在臨時目錄中創建編號文件,並對應zoo.cfg中配置的編號寫入文件

echo 1 > /myapp/zookeeper-3.4.6/temp/myid   # node02中
echo 2 > /myapp/zookeeper-3.4.6/temp/myid   # node03中
echo 3 > /myapp/zookeeper-3.4.6/temp/myid   # node04中

運行zookeeper(node02、node03、node04)

用下面命令啓動

zkServer.sh start

查看狀態

zkServer.sh status

顯示中若爲Mode: leader則該節點爲主節點,若爲Mode: follower則該節點爲從節點。

啓動zookeeper客戶端

zkCli.sh

停止zookeeper

zkServer.sh stop

注意:zookeeper集羣只有啓動過半節點狀態才爲啓動成功,例如3臺集羣啓動2臺以上,5臺集羣啓動3臺以上。

四、namenode節點信息同步

node01和node02爲namenode,所以這兩個節點的信息應該一致。

啓動journalnode(node01、node02、node03,由第一節架構圖可知)

hdfs --daemon start journalnode

格式化namenode(node01)

hdfs namenode -format

啓動namenode(node01上的)

hdfs --daemon start namenode

在node02上輸入以下命令將node01的信息同步到node02

hdfs namenode -bootstrapStandby

同步成功後會在/myapp/hadoop-3.1.2/etc/ha_temp/dfs/name/current中有文件。

五、zookeeper格式化、ha啓動及測試

格式化zookeeper(node01中)

hdfs zkfc -formatZK

格式化成功後使用“zkCli.sh”進入zookeeper,再使用“ls /”可以看到生成了/hadoop-ha/mycluster目錄,裏面存放有namenode。

啓動ha(node01中)

start-dfs.sh

啓動後,用jps查看每臺機器運行的進程,與第一節圖中的一致。

測試

在windows瀏覽器中輸入“192.168.182.140:9870”可以看到node01爲activate狀態,在瀏覽器中輸入“192.168.182.141:9870”可以看到node02爲standby狀態。

在node01上用以下命令關閉namenode

hdfs --daemon stop namenode

在瀏覽器中刷新node02,可以看到狀態從standby變爲activate,實現了namenode自動切換。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章