Hadoop3.x生產(chǎn)環(huán)境調(diào)優(yōu)之高可用

1 hadoop HA高可用

  • 實(shí)現(xiàn)高可用最關(guān)鍵的策略是消除單點(diǎn)故障。HA嚴(yán)格來(lái)說(shuō)應(yīng)該分成各個(gè)組件的HA機(jī)制:HDFS的HA和YARN的HA。
  • 前提:配置zookeeper集群

1.1 HDFS HA 高可用

工作機(jī)制
  • 元數(shù)據(jù)管理方式需要改變:內(nèi)存中各自保存一份元數(shù)據(jù);Edits日志只有Active狀態(tài)的NameNode節(jié)點(diǎn)可以做寫(xiě)操作;兩個(gè)NameNode都可以讀取Edits;共享的Edits放在一個(gè)共享存儲(chǔ)中管理(journal和NFS兩個(gè)主流實(shí)現(xiàn));
  • 需要一個(gè)狀態(tài)管理功能模塊:實(shí)現(xiàn)了一個(gè)zkfailover,常駐在每一個(gè)namenode所在的節(jié)點(diǎn),每一個(gè)zkfailover負(fù)責(zé)監(jiān)控自己所在NameNode節(jié)點(diǎn),利用zk進(jìn)行狀態(tài)標(biāo)識(shí),當(dāng)需要進(jìn)行狀態(tài)切換時(shí),由zkfailover來(lái)負(fù)責(zé)切換,切換時(shí)需要防止brain split現(xiàn)象的發(fā)生。
  • 必須保證兩個(gè)NameNode之間能夠ssh無(wú)密碼登錄
  • 隔離(Fence),即同一時(shí)刻僅僅有一個(gè)NameNode對(duì)外提供服務(wù)
HDFS HA自動(dòng)故障轉(zhuǎn)移工作機(jī)制

ZKFC是自動(dòng)故障轉(zhuǎn)移中的另一個(gè)新組件,是ZooKeeper的客戶(hù)端,也監(jiān)視和管理NameNode的狀態(tài)。每個(gè)運(yùn)行NameNode的主機(jī)也運(yùn)行了一個(gè)ZKFC進(jìn)程,ZKFC負(fù)責(zé):

  • 健康監(jiān)測(cè):ZKFC使用一個(gè)健康檢查命令定期地ping與之在相同主機(jī)的NameNode,只要該NameNode及時(shí)地回復(fù)健康狀態(tài),ZKFC認(rèn)為該節(jié)點(diǎn)是健康的。如果該節(jié)點(diǎn)崩潰,凍結(jié)或進(jìn)入不健康狀態(tài),健康監(jiān)測(cè)器標(biāo)識(shí)該節(jié)點(diǎn)為非健康的。
  • ZooKeeper會(huì)話管理:當(dāng)本地NameNode是健康的,ZKFC保持一個(gè)在ZooKeeper中打開(kāi)的會(huì)話。如果本地NameNode處于active狀態(tài),ZKFC也保持一個(gè)特殊的znode鎖,該鎖使用了ZooKeeper對(duì)短暫節(jié)點(diǎn)的支持,如果會(huì)話終止,鎖節(jié)點(diǎn)將自動(dòng)刪除。
  • 基于ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發(fā)現(xiàn)沒(méi)有其它的節(jié)點(diǎn)當(dāng)前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經(jīng)贏得了選擇,并負(fù)責(zé)運(yùn)行故障轉(zhuǎn)移進(jìn)程以使它的本地NameNode為Active。故障轉(zhuǎn)移進(jìn)程與前面描述的手動(dòng)故障轉(zhuǎn)移相似,首先如果必要保護(hù)之前的現(xiàn)役NameNode,然后本地NameNode轉(zhuǎn)換為Active狀態(tài)。
配置HDFS HA

hdfs-site.xml

<configuration>
    <!-- 完全分布式集群名稱(chēng) -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>

    <!-- 集群中NameNode節(jié)點(diǎn)都有哪些 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>

    <!-- nn1的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>hadoop01:9000</value>
    </property>

    <!-- nn2的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop02:9000</value>
    </property>

    <!-- nn1的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop01:50070</value>
    </property>

    <!-- nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop02:50070</value>
    </property>

    <!-- 指定NameNode元數(shù)據(jù)在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
    </property>

    <!-- 配置隔離機(jī)制,即同一時(shí)刻只能有一臺(tái)服務(wù)器對(duì)外響應(yīng) -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>

    <!-- 使用隔離機(jī)制時(shí)需要ssh無(wú)秘鑰登錄-->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/root/.ssh/id_rsa</value>
    </property>

    <!-- 聲明journalnode服務(wù)器存儲(chǔ)目錄-->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/ha/hadoop-3.13/data/jn</value>
    </property>

    <!-- 關(guān)閉權(quán)限檢查-->
    <property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
    </property>

    <!-- 訪問(wèn)代理類(lèi):client,mycluster,active配置失敗自動(dòng)切換實(shí)現(xiàn)方式-->
    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
</configuration>
  • 在各個(gè)JournalNode節(jié)點(diǎn)上,輸入以下命令啟動(dòng)journalnode服務(wù)
    sbin/hadoop-daemon.sh start journalnode
  • 在[nn1]上,對(duì)其進(jìn)行格式化,并啟動(dòng)
    bin/hdfs namenode -format
    sbin/hadoop-daemon.sh start namenode
  • 在[nn2]上,同步nn1的元數(shù)據(jù)信息
    bin/hdfs namenode -bootstrapStandby
  • 啟動(dòng)[nn2]
    sbin/hadoop-daemon.sh start namenode
  • 在[nn1]上,啟動(dòng)所有datanode
    sbin/hadoop-daemons.sh start datanode
  • 將[nn1]切換為Active
    bin/hdfs haadmin -transitionToActive nn1
  • 查看是否Active
    bin/hdfs haadmin -getServiceState nn1

配置HDFS-HA自動(dòng)故障轉(zhuǎn)移

hdfs-site.xml中增加

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

core-site.xml文件中增加

<property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
  • 關(guān)閉所有HDFS服務(wù):
    sbin/stop-dfs.sh
  • 啟動(dòng)Zookeeper集群:
    bin/zkServer.sh start
  • 初始化HA在Zookeeper中狀態(tài):
    bin/hdfs zkfc -formatZK
  • 啟動(dòng)HDFS服務(wù):
    sbin/start-dfs.sh
  • 在各個(gè)NameNode節(jié)點(diǎn)上啟動(dòng)DFSZK Failover Controller,先在哪臺(tái)機(jī)器啟動(dòng),哪個(gè)機(jī)器的NameNode就是Active NameNode
    sbin/hadoop-daemin.sh start zkfc

1.2 YARN HA 高可用

工作機(jī)制
yarn ha工作機(jī)制
配置YARN-HA集群

yarn-site.xml

<configuration>
    <!--啟用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
 
    <!--聲明兩臺(tái)resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

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

    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop01</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop02</value>
    </property>
 
    <!--指定zookeeper集群的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
    </property>

    <!--啟用自動(dòng)恢復(fù)--> 
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
 
    <!--指定resourcemanager的狀態(tài)信息存儲(chǔ)在zookeeper集群--> 
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

</configuration>
  • 在各個(gè)JournalNode節(jié)點(diǎn)上,輸入以下命令啟動(dòng)journalnode服務(wù):
    sbin/hadoop-daemon.sh start journalnode

  • 在[nn1]上,對(duì)其進(jìn)行格式化,并啟動(dòng):
    bin/hdfs namenode -format
    sbin/hadoop-daemon.sh start namenode

  • 在[nn2]上,同步nn1的元數(shù)據(jù)信息:
    bin/hdfs namenode -bootstrapStandby

  • 啟動(dòng)[nn2]:
    sbin/hadoop-daemon.sh start namenode

  • 啟動(dòng)所有DataNode
    sbin/hadoop-daemons.sh start datanode

  • 將[nn1]切換為Active
    bin/hdfs haadmin -transitionToActive nn1

  • 在hadoop02中執(zhí)行:
    sbin/start-yarn.sh

  • 在hadoop03中執(zhí)行:
    sbin/yarn-daemon.sh start resourcemanager

  • 查看服務(wù)狀態(tài)
    bin/yarn rmadmin -getServiceState rm1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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