寵物展會(huì)2025年時(shí)間表
858
2022-05-29
HDFS 2.x 高可用集群架構(gòu)
在這篇博客中,我將討論 HDFS 2.x 高可用性集群架構(gòu)和設(shè)置 HDFS 高可用性集群的過(guò)程。?這是大數(shù)據(jù) Hadoop 課程的重要組成部分。?本博客中涵蓋的主題順序如下:
HDFS HA架構(gòu)
介紹
NameNode 可用性
HA架構(gòu)
HA的實(shí)現(xiàn)(JournalNode和共享存儲(chǔ))
如何在 Hadoop 集群中設(shè)置 HA(Quorum Journal Nodes)?
介紹:
Hadoop 2 中引入了高可用性集群的概念。x 解決 Hadoop 1.x 中的單點(diǎn)故障問(wèn)題。正如您從我之前的博客中了解到的,HDFS 架構(gòu)?遵循主/從拓?fù)洌渲?NameNode 充當(dāng)主守護(hù)進(jìn)程,負(fù)責(zé)管理其他稱為 DataNode 的從節(jié)點(diǎn)。這個(gè)單一的 Master Daemon 或 NameNode 成為一個(gè)瓶頸。雖然,Secondary NameNode 的引入確實(shí)防止了我們的數(shù)據(jù)丟失和減輕 NameNode 的一些負(fù)擔(dān),但是并沒(méi)有解決 NameNode 的可用性問(wèn)題。
NameNode 可用性:
如果考慮 HDFS 集群的標(biāo)準(zhǔn)配置,NameNode 就會(huì)成為單點(diǎn)故障。這是因?yàn)橐坏?NameNode 變得不可用,整個(gè)集群就會(huì)變得不可用,直到有人重新啟動(dòng) NameNode 或帶來(lái)一個(gè)新的 NameNode。
NameNode 不可用的原因可能是:
像維護(hù)工作這樣的計(jì)劃事件會(huì)升級(jí)軟件或硬件。
也可能是由于計(jì)劃外事件,NameNode 因某些原因崩潰。
在上述任何一種情況下,我們都會(huì)遇到無(wú)法使用 HDFS 集群的停機(jī)時(shí)間,這成為一個(gè)挑戰(zhàn)。
HDFS HA架構(gòu):
讓我們了解一下 HDFS HA 架構(gòu)是如何解決 NameNode 可用性這一關(guān)鍵問(wèn)題的:
HA 架構(gòu)通過(guò)允許我們?cè)谥鲃?dòng)/被動(dòng)配置中擁有兩個(gè) NameNode 來(lái)解決 NameNode 可用性的問(wèn)題。因此,我們?cè)诟呖捎眯约褐杏袃蓚€(gè)同時(shí)運(yùn)行的 NameNode:
活動(dòng)名稱節(jié)點(diǎn)
備用/被動(dòng) NameNode。
如果一個(gè) NameNode 出現(xiàn)故障,另一個(gè) NameNode 可以接管責(zé)任,從而減少集群停機(jī)時(shí)間。備用 NameNode 用作備份 NameNode(與輔助 NameNode 不同),它將故障轉(zhuǎn)移功能合并到 Hadoop 集群。因此,使用 StandbyNode,我們可以在 NameNode 崩潰(意外事件)時(shí)自動(dòng)進(jìn)行故障轉(zhuǎn)移,或者在維護(hù)期間進(jìn)行正常(手動(dòng)啟動(dòng))故障轉(zhuǎn)移。
在 HDFS 高可用集群中維護(hù)一致性有兩個(gè)問(wèn)題:
Active 和 Standby NameNode 應(yīng)該始終彼此同步,即它們應(yīng)該具有相同的元數(shù)據(jù)。這將允許我們將 Hadoop 集群恢復(fù)到崩潰時(shí)的相同命名空間狀態(tài),因此,將為我們提供快速故障轉(zhuǎn)移。
一次應(yīng)該只有一個(gè)活動(dòng)的 NameNode,因?yàn)閮蓚€(gè)活動(dòng)的 NameNode 會(huì)導(dǎo)致數(shù)據(jù)損壞。這種場(chǎng)景被稱為裂腦場(chǎng)景,其中一個(gè)集群被分成更小的集群,每個(gè)集群都認(rèn)為它是唯一的活動(dòng)集群。為了避免這種情況,圍欄已經(jīng)完成。防護(hù)是一種確保在特定時(shí)間只有一個(gè) NameNode 保持活動(dòng)狀態(tài)的過(guò)程。
HA架構(gòu)的實(shí)現(xiàn):
現(xiàn)在,您知道在 HDFS HA 架構(gòu)中,我們有兩個(gè) NameNode 同時(shí)運(yùn)行。所以,我們可以通過(guò)以下兩種方式實(shí)現(xiàn)主備NameNode配置:
使用仲裁日志節(jié)點(diǎn)
使用 NFS 的共享存儲(chǔ)
讓我們了解一下這兩種執(zhí)行方式:
1. 使用仲裁日志節(jié)點(diǎn):
備用 NameNode 和活動(dòng) NameNode 通過(guò)一組單獨(dú)的節(jié)點(diǎn)或守護(hù)程序(稱為 JournalNodes)保持彼此同步?。?JournalNode 遵循環(huán)形拓?fù)洌渲泄?jié)點(diǎn)相互連接以形成環(huán)。?JournalNode 為收到的請(qǐng)求提供服務(wù),并將信息復(fù)制到環(huán)中的其他節(jié)點(diǎn)中。這在 JournalNode 失敗的情況下提供了容錯(cuò)能力。
活動(dòng) NameNode 負(fù)責(zé)更新 JournalNodes 中存在的 EditLogs(元數(shù)據(jù)信息)。
StandbyNode 讀取對(duì) JournalNode 中的 EditLogs 所做的更改,并以恒定方式將其應(yīng)用于自己的命名空間。
在故障轉(zhuǎn)移期間,StandbyNode 確保它在成為新的 Active NameNode 之前已從 JournalNodes 更新其元數(shù)據(jù)信息。這使得當(dāng)前命名空間狀態(tài)與故障轉(zhuǎn)移之前的狀態(tài)同步。
兩個(gè) NameNode 的 IP 地址對(duì)所有 DataNode 都可用,它們向兩個(gè) NameNode 發(fā)送心跳和塊位置信息。這提供了快速故障轉(zhuǎn)移(更少的停機(jī)時(shí)間),因?yàn)?StandbyNode 具有有關(guān)集群中塊位置的更新信息。
NameNode的圍欄:
現(xiàn)在,如前所述,確保一次只有一個(gè)活動(dòng) NameNode 非常重要。因此,圍欄是確保集群中的這一特性的過(guò)程。
JournalNodes 通過(guò)一次只允許一個(gè) NameNode 作為寫入者來(lái)執(zhí)行這種防護(hù)。
備用 NameNode 負(fù)責(zé)寫入 JournalNodes 并禁止任何其他 NameNode 保持活動(dòng)狀態(tài)。
最后,新的 Active NameNode 可以安全地執(zhí)行其活動(dòng)。
2. 使用共享存儲(chǔ):
StandbyNode 和活動(dòng)的 NameNode 使用共享存儲(chǔ)設(shè)備保持同步。?活動(dòng) NameNode 將在其命名空間中所做的任何修改的記錄記錄到此共享存儲(chǔ)中存在的 EditLog。?StandbyNode 讀取對(duì)此共享存儲(chǔ)中的 EditLogs 所做的更改并將其應(yīng)用于自己的命名空間。
現(xiàn)在,如果發(fā)生故障轉(zhuǎn)移,StandbyNode 首先使用共享存儲(chǔ)中的 EditLogs 更新其元數(shù)據(jù)信息。然后,它承擔(dān)了 Active NameNode 的責(zé)任。這使得當(dāng)前命名空間狀態(tài)與故障轉(zhuǎn)移之前的狀態(tài)同步。
管理員必須至少配置一種防護(hù)方法以避免出現(xiàn)裂腦情況。
該系統(tǒng)可以采用一系列圍欄機(jī)制。它可能包括終止 NameNode 的進(jìn)程并撤銷其對(duì)共享存儲(chǔ)目錄的訪問(wèn)權(quán)限。
作為最后的手段,我們可以使用一種稱為 STONITH 的技術(shù)來(lái)隔離之前處于活動(dòng)狀態(tài)的 NameNode,或者“在頭部射擊另一個(gè)節(jié)點(diǎn)”。STONITH 使用專門的配電單元強(qiáng)行關(guān)閉 NameNode 機(jī)器。
自動(dòng)故障轉(zhuǎn)移:
故障轉(zhuǎn)移是系統(tǒng)在檢測(cè)到故障或故障時(shí)自動(dòng)將控制轉(zhuǎn)移到輔助系統(tǒng)的過(guò)程。有兩種類型的故障轉(zhuǎn)移:
Graceful Failover:?在這種情況下,我們手動(dòng)啟動(dòng)故障轉(zhuǎn)移以進(jìn)行日常維護(hù)。
自動(dòng)故障轉(zhuǎn)移:?在這種情況下,在 NameNode 故障(計(jì)劃外事件)的情況下會(huì)自動(dòng)啟動(dòng)故障轉(zhuǎn)移。
Apache Zookeeper 是一種在 HDFS 高可用性集群中提供自動(dòng)故障轉(zhuǎn)移功能的服務(wù)。它維護(hù)少量的協(xié)調(diào)數(shù)據(jù),通知客戶端該數(shù)據(jù)的變化,并監(jiān)控客戶端的故障。Zookeeper 與 NameNode 保持會(huì)話。如果發(fā)生故障,會(huì)話將過(guò)期,Zookeeper 將通知其他 NameNode 啟動(dòng)故障轉(zhuǎn)移過(guò)程。在 NameNode 失敗的情況下,其他被動(dòng) NameNode 可以在 Zookeeper 中鎖定,聲明它想成為下一個(gè) Active NameNode。
ZookeerFailoverController (ZKFC) 是一個(gè) Zookeeper 客戶端,它也監(jiān)控和管理 NameNode 狀態(tài)。每個(gè) NameNode 也運(yùn)行一個(gè) ZKFC。ZKFC 負(fù)責(zé)定期監(jiān)控 NameNode 的健康狀況。
現(xiàn)在您已經(jīng)了解了 Hadoop 集群中的高可用性,是時(shí)候設(shè)置它了。要在 Hadoop 集群中設(shè)置高可用性,您必須在所有節(jié)點(diǎn)中使用 Zookeeper。
Active NameNode 中的守護(hù)進(jìn)程是:
動(dòng)物園管理員
Zookeeper 故障轉(zhuǎn)移控制器
日志節(jié)點(diǎn)
名稱節(jié)點(diǎn)
備用 NameNode 中的守護(hù)進(jìn)程是:
動(dòng)物園管理員
Zookeeper 故障轉(zhuǎn)移控制器
日志節(jié)點(diǎn)
名稱節(jié)點(diǎn)
DataNode 中的守護(hù)進(jìn)程是:
動(dòng)物園管理員
日志節(jié)點(diǎn)
數(shù)據(jù)節(jié)點(diǎn)
如果您想掌握 HDFS 和 Hadoop,請(qǐng)查看 Edureka 特別策劃的大數(shù)據(jù)和 Hadoop 課程。單擊下面的按鈕開(kāi)始。
在 Hadoop 中設(shè)置和配置高可用性集群:
您必須首先設(shè)置每個(gè)節(jié)點(diǎn)的 Java 和主機(jī)名。
下載 Hadoop 和 Zookeeper 二進(jìn)制 tar 文件,解壓縮文件以編輯配置文件。
命令:?wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
解壓 zookeeper-3.4.6.tar.gz
命令:tar –xvf zookeeper-3.4.6.tar.gz
從 Apache Hadoop 站點(diǎn)下載穩(wěn)定的 Hadoop 二進(jìn)制 tar。
命令:wget https://archive.apache.org/dist/hadoop/core/hadoop-2.6.0/hadoop-2.6.0.tar.gz
Extract the Hadoop tar ball.
命令:tar –xvf hadoop-2.6.0.tar.gz
解壓 hadoop 二進(jìn)制文件。
將 Hadoop、Zookeeper 和路徑添加到 .bashrc 文件。
打開(kāi) .bashrc 文件。
命令:sudo gedit ~/.bashrc
添加以下路徑:
export HADOOP_HOME=< Path to your Hadoop-2.6.0 directory> export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop export JAVA_HOME=
編輯 .bashrc 文件。
在所有節(jié)點(diǎn)中啟用 SSH。
在所有節(jié)點(diǎn)中生成 SSH 密鑰。
命令:ssh-keygen –t rsa(所有節(jié)點(diǎn)中的這一步)
在所有節(jié)點(diǎn)中設(shè)置 SSH 密鑰。
不要提供 Enter 文件的任何路徑來(lái)保存密鑰,也不要提供任何密碼。按回車鍵。
在所有節(jié)點(diǎn)生成ssh密鑰過(guò)程。
生成 ssh 密鑰后,您將獲得公鑰和私鑰。
.ssh 密鑰目錄應(yīng)包含權(quán)限 700,.ssh 目錄中的所有密鑰應(yīng)包含權(quán)限 600。
更改 SSH 目錄權(quán)限。
修改目錄為.ssh,修改文件權(quán)限為600
更改公鑰和私鑰權(quán)限。
您必須將 Name 節(jié)點(diǎn) ssh 公鑰復(fù)制到所有節(jié)點(diǎn)。
在 Active Namenode 中,使用 cat 命令復(fù)制 id_rsa.pub。
命令:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
將 Namenode ssh 密鑰復(fù)制到它的授權(quán)密鑰。
使用ssh-copy-id命令將 NameNode 公鑰復(fù)制到所有節(jié)點(diǎn)。
命令:ssh-copy-id –i .ssh/id_rsa.pub?edureka@nn2.cluster.com
將用途密鑰復(fù)制到備用 NameNode。
將 NameNode 公鑰復(fù)制到數(shù)據(jù)節(jié)點(diǎn)。
命令:ssh-copy-id –i .ssh/id_rsa.pub?edureka@dn1.cluster.com
將 Namenode 公鑰復(fù)制到數(shù)據(jù)節(jié)點(diǎn)。
重啟所有節(jié)點(diǎn)的sshd服務(wù)。
命令:sudo service sshd restart(在所有節(jié)點(diǎn)中執(zhí)行)
重啟 SSH 服務(wù)。
現(xiàn)在您無(wú)需任何身份驗(yàn)證即可從 Namenode 登錄到任何節(jié)點(diǎn)。
從 Active Name 節(jié)點(diǎn)打開(kāi) core-site.xml 文件并添加以下屬性。
從 Active namenode 編輯 core-site.xml
在 Active Namenode 中打開(kāi) hdfs-site.xml 文件。添加以下屬性。
將目錄更改為zookeeper的conf目錄。
命令:cd zookeeper-3.4.6/conf
Zookeeper Conf 目錄。
在您有 zoo_sample.cfg 文件的 conf 目錄中,使用 zoo_sample.cfg 文件創(chuàng)建 zoo.cfg。
命令:cp zoo_sample.cfg zoo.cfg
創(chuàng)建 zoo.cfg 文件。
在任意位置創(chuàng)建目錄,并使用該目錄存儲(chǔ)zookeeper數(shù)據(jù)。
命令:mkdir
創(chuàng)建一個(gè)目錄來(lái)存儲(chǔ)zookeeper數(shù)據(jù)。
打開(kāi) zoo.cfg 文件。
命令:gedit zoo.cfg
將在上述步驟中創(chuàng)建的目錄路徑添加到 dataDir 屬性,并在 zoo.cfg 文件中添加有關(guān)剩余節(jié)點(diǎn)的以下詳細(xì)信息。
Server.1=nn1.cluster.com:2888:3888
Server.2=nn2.cluster.com:2888:3888
Server.3=dn1.cluster.com:2888:3888
編輯 zoo.cfg 文件。
現(xiàn)在使用 scp 命令將 Java 和 Hadoop-2.6.0、zookeeper-3.4.6 目錄和 .bashrc 文件復(fù)制到所有節(jié)點(diǎn)(備用名稱節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn))。
命令:scp -r <目錄路徑> edureka@
將 Hadoop、Zookeeper 和 .bashrc 文件復(fù)制到所有節(jié)點(diǎn)。
同理,將.bashrc文件和zookeeper目錄復(fù)制到所有節(jié)點(diǎn),并根據(jù)各自的節(jié)點(diǎn)更改每個(gè)節(jié)點(diǎn)中的環(huán)境變量。
在數(shù)據(jù)節(jié)點(diǎn)中,創(chuàng)建您需要存儲(chǔ) HDFS 塊的任何目錄。
在數(shù)據(jù)節(jié)點(diǎn)中,您必須添加 dfs.datanode.data.dir 屬性。
就我而言,我創(chuàng)建了datanode目錄來(lái)存儲(chǔ)塊。
創(chuàng)建Datanode目錄。
更改數(shù)據(jù)節(jié)點(diǎn)目錄的權(quán)限。
更改 Datanode 目錄權(quán)限。
打開(kāi) HDFS-site.xml 文件,在 dfs.datanode.data.dir 屬性中添加此 Datanode 目錄路徑。
注意:保留從 Active namenode 復(fù)制的所有屬性;在 namenode 中添加 dfs.datanode.data.dir 一個(gè)提取屬性。
在 Active namenode 中,更改要存儲(chǔ) zookeeper 配置文件的目錄(dataDir 屬性路徑)。
在目錄中創(chuàng)建 myid 文件并將數(shù)字 1 添加到文件中并保存文件。
命令:vi myid
創(chuàng)建 myid 文件。
在備用名稱節(jié)點(diǎn)中,更改要存儲(chǔ) zookeeper 配置文件的目錄(dataDir 屬性路徑)。
在目錄中創(chuàng)建 myid 文件并將數(shù)字 2 添加到文件中并保存文件。
在數(shù)據(jù)節(jié)點(diǎn)中,更改要存儲(chǔ) zookeeper 配置文件的目錄(dataDir 屬性路徑)。
在目錄中創(chuàng)建 myid 文件并將數(shù)字 3 添加到文件中并保存文件。
在所有三個(gè)節(jié)點(diǎn)中啟動(dòng)Journalnode。
命令:hadoop-daemon.sh 啟動(dòng)journalnode
啟動(dòng)日志節(jié)點(diǎn)。
當(dāng)您輸入 jps 命令時(shí),您將在所有節(jié)點(diǎn)中看到 JournalNode 守護(hù)進(jìn)程。
格式化活動(dòng)名稱節(jié)點(diǎn)。
命令:HDFS 目的 -format
活動(dòng) NameNode 格式。
啟動(dòng) Namenode 守護(hù)進(jìn)程和 Active Namedode。
命令:hadoop-daemon.sh 啟動(dòng)目的
啟動(dòng)名稱節(jié)點(diǎn)。
將 HDFS Meta 數(shù)據(jù)從活動(dòng)名稱節(jié)點(diǎn)復(fù)制到備用名稱節(jié)點(diǎn)。
命令:HDFS 預(yù)期 -bootstrapStandby
將 HDFS 元數(shù)據(jù)從 Active Name node 復(fù)制到 Standby Namenode。
運(yùn)行此命令后,您將獲得元數(shù)據(jù)正在復(fù)制的節(jié)點(diǎn)和位置以及是否成功復(fù)制的信息。
活動(dòng)目的詳細(xì)信息的信息。
一旦元數(shù)據(jù)從活動(dòng)名稱節(jié)點(diǎn)復(fù)制到備用名稱節(jié)點(diǎn),您將在屏幕截圖中看到以下消息。
關(guān)于備用 Namenode 中 HDFS 的信息。
在備用名稱節(jié)點(diǎn)機(jī)器上啟動(dòng)名稱節(jié)點(diǎn)守護(hù)進(jìn)程。
命令:hadoop-daemon.sh 啟動(dòng)目的
現(xiàn)在在所有三個(gè)節(jié)點(diǎn)中啟動(dòng) Zookeeper 服務(wù)。
命令:zkServer.sh start(在所有節(jié)點(diǎn)運(yùn)行此命令)
在主動(dòng)目的中:
在 Active NameNode 中啟動(dòng) zookeeper。
在備用 Namenode 中:
在備用 NameNode 中啟動(dòng) zookeeper。
在數(shù)據(jù)節(jié)點(diǎn)中:
在 DataNode 中啟動(dòng) zookeeper。
運(yùn)行Zookeeper服務(wù)器后,輸入JPS命令。在所有節(jié)點(diǎn)中,您將看到 QuorumPeerMain 服務(wù)。
在數(shù)據(jù)節(jié)點(diǎn)機(jī)器中啟動(dòng)數(shù)據(jù)節(jié)點(diǎn)守護(hù)進(jìn)程。
命令:hadoop-daemon.sh 啟動(dòng)數(shù)據(jù)節(jié)點(diǎn)
在活動(dòng)名稱節(jié)點(diǎn)和備用名稱節(jié)點(diǎn)中啟動(dòng) Zookeeper 故障轉(zhuǎn)移控制器。
在 Active namenode 中格式化 zookeeper 故障轉(zhuǎn)移控制器。
命令:?HDFS zkfc –formatZK
格式化 ZKFC。
在 Active namenode 中啟動(dòng) ZKFC。
命令:hadoop-daemon.sh 啟動(dòng) zkfc
輸入 jps 命令以檢查 DFSZkFailoverController 守護(hù)進(jìn)程。
啟動(dòng) ZKFC。
在 Standby namenode 中格式化 zookeeper 故障轉(zhuǎn)移控制器。
命令:hdfs zkfc –formatZK
在 Standby namenode 中啟動(dòng) ZKFC。
命令:hadoop-daemon.sh 啟動(dòng) zkfc
輸入 jps 命令以檢查 DFSZkFailoverController 守護(hù)進(jìn)程。
現(xiàn)在使用以下命令檢查每個(gè) Namenode 的狀態(tài),哪個(gè)節(jié)點(diǎn)處于活動(dòng)狀態(tài)或哪個(gè)節(jié)點(diǎn)處于待機(jī)狀態(tài)。
命令:hdfs haadmin –getServiceState nn1
檢查每個(gè) NameNode 的狀態(tài)。
現(xiàn)在使用 Web 瀏覽器檢查每個(gè) Namenode 的狀態(tài)。
打開(kāi) Web 瀏覽器并輸入以下 URL。
<活動(dòng)Namenode的IP地址>:50070
它將顯示名稱節(jié)點(diǎn)是活動(dòng)的還是備用的。
活動(dòng) NameNode。
使用 Web 瀏覽器打開(kāi)另一個(gè)名稱節(jié)點(diǎn)詳細(xì)信息。
備用NameNode。
在 Active namenode 中,殺死 namenode 守護(hù)程序以將 Standby name node 更改為 active namenode。
在 Active namenode 中輸入 jps 并終止守護(hù)進(jìn)程。
命令:?sudo kill -9
守護(hù)進(jìn)程 ID。
Namenode進(jìn)程ID是7606,殺掉namenode。
命令?:Sudo kill -9 7606
殺死名稱節(jié)點(diǎn)進(jìn)程
通過(guò)網(wǎng)絡(luò)瀏覽器打開(kāi)兩個(gè)節(jié)點(diǎn)并檢查狀態(tài)。
名稱節(jié)點(diǎn)詳細(xì)信息。
NameNode 狀態(tài)。
恭喜,您已成功在 Hadoop 中設(shè)置 HDFS 高可用性集群。
Hadoop 數(shù)據(jù)挖掘
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。