Hadoop-HA高可用集群QJM搭建

1.此教程默認(rèn)已經(jīng)搭建好完全分布式

2. Zookeeper 集群搭建

配置完全分布式zk集群
---------------------
    1.挑選3臺主機(jī)
        cs1 ~ cs3
    2.每臺機(jī)器都安裝zk
        tar
        環(huán)境變量

    3.配置zk配置文件
        cs1 ~ cs3
        [/home/ap/apps/zk/conf/zoo.cfg]
        ...
        dataDir=/home/ap/zookeeper

    4.在每臺主機(jī)的/home/centos/zookeeper中添加myid,內(nèi)容分別是1,2,3
        [cs1]
        $>echo 1 > /home/ap/zookeeper/myid
        [cs2]
        $>echo 2 > /home/ap/zookeeper/myid
        [cs3]
        $>echo 3 > /home/ap/zookeeper/myid

    5.啟動服務(wù)器集群 
        $>zkServer.sh start
            
    6.查看每臺服務(wù)器的狀態(tài)
        $>zkServer.sh status
* 注意: 如果有3臺機(jī)器, 只啟動一臺的話, 會顯示如下, 因?yàn)楦鶕?jù)配置, 有3臺機(jī)器, 此時只有一臺啟動, 沒有過半數(shù), 整個集群是掛掉的
* 只有啟動的機(jī)器數(shù)量超過配置的半數(shù), zk 集群才有效.

3.HA 集群搭建

首先聲明

筆者用的6臺主機(jī), 主機(jī)名 cs1-cs6, 用戶名為ap, 可以對照改為自己的主機(jī)名&用戶名

另外, 搭建 HA 不會影響原來的完全分布式, 具體操作會在下面告知.
hadoop 安裝目錄層級結(jié)構(gòu):

  • /home/ap/apps/hadoop/etc/hadoop/hdfs-site.xml

data 目錄層級結(jié)構(gòu):

  • cs1: /home/ap/hadoopdata/namenode/current/edits_00....
  • cs2: /home/ap/hadoopdata/datanode/current/BP-15...

可以對照參考


集群結(jié)構(gòu)如下

image-20180622004722436

開始搭建

首先保證 各節(jié)點(diǎn)直接的 ssh 免密登錄沒問題

  • 如果非生產(chǎn)環(huán)境, 可以同時把 .ssh刪掉后, 全部重新生成 ssh-keygen, 同時相互發(fā)送, 這樣操作最簡單, 效率最高.

其次上代碼了

  1. 把原本/home/ap/apps/hadoop/etc/hadoop中的 hadoop目錄改為full,意思是完全分布式.
  2. cp -r full ha, 復(fù)制一份 full 為 ha, 在這份配置文件中配置 HA
  3. ln -s /home/ap/apps/hadoop/etc/ha /home/ap/apps/hadoop/etc/hadoop, 用一個軟鏈接hadoop 指向 ha
  4. 配置 /home/ap/apps/hadoop/etc/ha/hdfs-site.xml
[hdfs-site.xml]
------------------------------------------------------------------
<configuration>

    <!-- 指定 2個 namenode 的命名空間 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>

    <!-- myucluster下的名稱節(jié)點(diǎn)兩個id -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>

    <!-- 配置每個nn的rpc地址。 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>cs1:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>cs6:8020</value>
    </property>

    <!-- 配置webui端口 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>cs1:50070</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>cs6:50070</value>
    </property>

    <!-- 名稱節(jié)點(diǎn)共享編輯目錄. -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://cs2:8485;cs3:8485;cs4:8485/mycluster</value>
    </property>

    <!-- java類,client使用它判斷哪個節(jié)點(diǎn)是激活態(tài)。 -->
    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 腳本列表或者java類,在容災(zāi)保護(hù)激活態(tài)的nn. -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
                sshfence
                shell(/bin/true)
        </value>
    </property>

    <!-- ssh免密登陸 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/ap/.ssh/id_rsa</value>
    </property>

    <!-- 配置 sshfence 隔離機(jī)制超時時間(可不配) -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>

    <!-- 配置JN存放edit的本地路徑。 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/ap/hadoopdata/journal</value>
    </property>
    
</configuration>
  1. 配置 core-site.xml, 這里給出完整配置 (目前不包括 Hive 配置)
[core-site.xml]
------------------------------------------------------------
<configuration>
    
    <!-- 指定 hdfs 的 nameservice 為 mycluster -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>

    <!-- 指定 hadoop 工作目錄 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/ap/hadoopdata</value>
    </property>

    <!-- 指定zk集群訪問地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>cs1:2181,cs2:2181,cs3:2181</value>
    </property>

</configuration>
  1. 配置mapred-site.xml
[mapred-site.xml]
-------------------
<configuration>
    
    <!-- 指定 mr 框架為 yarn 方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <!-- 設(shè)置 mapreduce 的歷史服務(wù)器地址和端口號 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>cs1:10020</value>
    </property>

    <!-- mapreduce 歷史服務(wù)器的 web 訪問地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>cs1:19888</value>
    </property>
    
</configuration>
  1. /home/ap/apps/hadoop/etc/*發(fā)給其他所有節(jié)點(diǎn) 2-6
    • 注意: 軟鏈接scp 的時候會有問題, 最終保證每個節(jié)點(diǎn)跟 cs1一樣就可以了,可以每個節(jié)點(diǎn)單獨(dú)修改, 也可以寫腳本一起修改
    • ln -sfT /home/ap/apps/hadoop/etc/ha /home/ap/apps/hadoop/etc/hadoop
  2. 部署細(xì)節(jié)
0.在 zk 節(jié)點(diǎn)啟動 zkServer
cs1-cs3: $>zkServer.sh start

1.在jn節(jié)點(diǎn)分別啟動jn進(jìn)程
$>hadoop-daemon.sh start journalnode

2.啟動jn之后,在兩個NN之間進(jìn)行disk元數(shù)據(jù)同步
    a)如果是全新集群,先format文件系統(tǒng),只需要在一個nn上執(zhí)行。
    [cs1]
    $>hadoop namenode -format

    b)如果將非HA集群轉(zhuǎn)換成HA集群,復(fù)制原NN的metadata到另一個nn.
        1.步驟一
        [cs1]
        $>scp -r /home/centos/hadoop/dfs ap@cs6:/home/centos/hadoop/

        2.步驟二
        在新的nn(未格式化的nn)上運(yùn)行一下命令,實(shí)現(xiàn)待命狀態(tài)引導(dǎo)。
        [cs6]
        $>hdfs namenode -bootstrapStandby        //需要cs1為啟動狀態(tài),提示是否格式化,選擇N.

3.在一個NN上執(zhí)行以下命令,完成edit日志到j(luò)n節(jié)點(diǎn)的傳輸。
$>hdfs namenode -initializeSharedEdits
#查看cs2,cs3,cs4 這幾個 jn 節(jié)點(diǎn)是否有edit數(shù)據(jù).

4.啟動所有節(jié)點(diǎn).
[cs1]
$>hadoop-daemon.sh start namenode        //啟動名稱節(jié)點(diǎn)
$>hadoop-daemons.sh start datanode        //啟動所有數(shù)據(jù)節(jié)點(diǎn)

[2,3,4]
$>hadoop-daemon.sh start journalnode

[cs6]
$>hadoop-daemon.sh start namenode        //啟動名稱節(jié)點(diǎn)
  1. HA 管理
# 查看web 界面, 是否是2個 standby 狀態(tài)
http://cs1:50070/
http://cs6:50070/

hdfs haadmin : 查看 ha 幫助
-----------------
$>hdfs haadmin -transitionToActive nn1                //切成激活態(tài)
$>hdfs haadmin -transitionToStandby nn1                //切成待命態(tài)
$>hdfs haadmin -transitionToActive --forceactive nn2//強(qiáng)行激活
$>hdfs haadmin -failover nn1 nn2                    //模擬容災(zāi)演示,從nn1切換到nn2
  1. 加入 Zookeeper 容災(zāi)服務(wù) zkfc
<!-- 1.部署容災(zāi) -->
------------------------------
a.停止所有進(jìn)程
$>stop-all.sh

b.配置hdfs-site.xml,啟用自動容災(zāi).
[hdfs-site.xml]
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

c.配置core-site.xml,指定zk的連接地址.
<property>
    <name>ha.zookeeper.quorum</name>
    <value>cs1:2181,cs2:2181,cs3:2181</value>
</property>

d.分發(fā)以上兩個文件到所有節(jié)點(diǎn)。


<!-- 2.登錄其中的一臺NN(s201),在ZK中初始化HA狀態(tài),
    創(chuàng)建 namenode 的 命名空間節(jié)點(diǎn) mycluster -->
------------------------------------
$>hdfs zkfc -formatZK


<!-- 3.啟動hdfs進(jìn)程. -->    
$>start-dfs.sh

<!-- 4.查看 webUI, 是否有一臺自動切換為 active 狀態(tài)了 -->
http://cs1:50070/
http://cs6:50070/

<!-- 5.測試自動容災(zāi)(如果cs6是活躍節(jié)點(diǎn)) -->    
$>kill -9  cs6的 namenode進(jìn)程號
觀察 cs1:50070的狀態(tài)變化
  1. 配置RM的HA自動容災(zāi)
1.配置yarn-site.xml

<configuration>
    <!-- 是否允許高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <!-- Identifies the cluster. Used by the elector to ensure an RM doesn’t take over as Active for another cluster.  -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster1</value>
    </property>

    <!-- RM 的 id -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <!-- 2臺 RM 的宿主 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>cs1</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>cs6</value>
    </property>

    <!-- 配置web界面 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>cs1:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>cs6:8088</value>
    </property>

    <!-- zookeeper 地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>cs1:2181,cs2:2181,cs3:2181</value>
    </property>

    <!-- YARN 集群為 MapReduce 程序提供的 shuffle 服務(wù)(原本的)  -->
    <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
    </property>

    <!-- ===========以下是可選的============= -->
    <!-- 開啟 YARN 集群的日志聚合功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>

    <!-- YARN 集群的聚合日志最長保留時長 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>

    <!-- 啟用自動恢復(fù) -->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>

    <!-- 指定 resourcemanager 的狀態(tài)信息存儲在 zookeeper 集群上-->
    <property>
        <name>yarn.resourcemanager.store.class</name>
            <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
</configuration>
------------------------------------------------------------------


2.使用管理命令
<!-- 查看狀態(tài) -->
$>yarn rmadmin -getServiceState rm1
<!-- 切換狀態(tài)到standby -->
$>yarn rmadmin -transitionToStandby rm1

3.啟動yarn集群
$>start-yarn.sh

4.hadoop沒有啟動兩個resourcemanager,需要手動啟動另外一個
$>yarn-daemon.sh start resourcemanager

5.查看webUI, 點(diǎn)擊 About, 查看 active 或 standby
http://cs1:8088
http://cs6:8088

6.做容災(zāi)模擬.
kill -9 活躍的 RM 端口號

7.注意: 如果容災(zāi)失敗, 檢查下每臺主機(jī)時間是否同步
$>sudo ntpdate ntp1.aliyun.com

至此, 大功告成


4.HA 集群的啟動/關(guān)閉

4.1 HA 的啟動

一:單點(diǎn)啟動

  1. 啟動 zk 服務(wù) QuorumPeerMain, 否則后面 RM 會起不來,連不上 ZK 服務(wù)
    cs1-cs3: $> zkServer.sh start

  2. 啟動 namenode/datanode
    cs1,cs6: $> hadoop-daemon.sh start namenode
    cs1/cs6: $> hadoop-daemons.sh start datanode
    cs6: $> hadoop-daemon.sh start namenode

  3. 啟動 journalnode
    cs2-cs4: $> hadoop-daemon.sh start journalnode

  4. 啟動RM (RM 會自動選出一個 active)
    cs1,cs6: $> yarn-daemon.sh start resourcemanager
    cs1/cs6: $> yarn-daemons.sh start nodemanager

  5. 啟動 zk 的 DFSZKFailoverController
    cs1,cs6: $> hadoop-daemon.sh start zkfc

  6. 此外可以啟動MapReduce 的歷史任務(wù)服務(wù)器

[ap@cs1]$> mr-jobhistory-daemon.sh start historyserver

然后訪問配置的 http://cs1:19888/jobhistory

二:懶漢啟動

  1. 啟動 zk 服務(wù) QuorumPeerMain, 否則后面 RM 會起不來,連不上 ZK 服務(wù)
    cs1-cs3: $> zkServer.sh start

  2. 執(zhí)行啟動全部

    cs1: $> start-all.sh(RM 節(jié)點(diǎn))

    或者, 使用新的啟動方式

    cs1: $> start-dfs.sh(任意節(jié)點(diǎn))

    cs1: $> start-yarn.sh(在 RM 節(jié)點(diǎn))

  3. 另一個 RM 節(jié)點(diǎn)不會自己啟動,要手動啟動

    cs6: $> yarn-daemon.sh start resourcemanager

4.2 HA 的關(guān)閉

在 一臺NN 上stop-all.sh, 注意 zk 的 server- QuorumPeerMain不會停掉

5.簡單時間同步腳本

# 在所有機(jī)器上寫定時任務(wù)
crontab -e
* */1 * * * /usr/sbin/ntpdate time1.aliyun.com
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容