溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

DataNode是怎么向NameNode發(fā)送心跳得

發(fā)布時(shí)間:2021-10-15 15:47:07 來(lái)源:億速云 閱讀:169 作者:iii 欄目:web開(kāi)發(fā)

這篇文章主要講解了“DataNode是怎么向NameNode發(fā)送心跳得”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“DataNode是怎么向NameNode發(fā)送心跳得”吧!

一、分布式系統(tǒng)中的心跳技術(shù)

心跳是分布式技術(shù)中常用的技術(shù)手段。心跳,顧名思義,就是以固定的頻率向其他節(jié)點(diǎn)匯報(bào)當(dāng)前節(jié)點(diǎn)狀態(tài)的方式。收到心跳,一般可以認(rèn)為發(fā)送心跳的這個(gè)節(jié)點(diǎn)在當(dāng)前的網(wǎng)絡(luò)拓?fù)渲惺橇己玫摹?/p>

當(dāng)然,心跳匯報(bào)時(shí),一般也會(huì)攜帶一些附加的狀態(tài)、元數(shù)據(jù)信息、當(dāng)前節(jié)點(diǎn)的信息,以便其他節(jié)點(diǎn)管理。

心跳有兩種方式:

  • 單向的 heartbeat;

  • 交互的 ping-pong;

第一種方式下,target 進(jìn)程需要定時(shí)給 detector 發(fā)送消息,告知自己的存活性。而 detector 無(wú)需給 target  回復(fù)任何消息,只是每隔一段時(shí)間去檢測(cè) target 進(jìn)程有沒(méi)有匯報(bào)。

第二種方式更為常見(jiàn),比如我們的 redis 就是采用這種方式:

detector -> target: Are you ok? target -> detector: Yeah, pretty good.

Detector 發(fā)起檢測(cè),如果 target 連續(xù) N 次不回復(fù)消息,那么 detector 就認(rèn)為其處于 non-active 狀態(tài)。

那么常用的心跳檢測(cè)機(jī)制有哪些:

(1)傳統(tǒng)的周期檢測(cè)心跳機(jī)制

其檢測(cè)方法很粗暴:設(shè)定一個(gè)超時(shí)時(shí)間 T,只要在 T 之內(nèi)沒(méi)有收到對(duì)方的心跳包便可認(rèn)為對(duì)方宕機(jī),方法簡(jiǎn)單有效,使用比較廣泛。

所以這個(gè)方法的重點(diǎn)就在于這個(gè)超時(shí)時(shí)間 T  的設(shè)置,設(shè)置的太短了,有可能會(huì)因?yàn)楫?dāng)前網(wǎng)絡(luò)阻塞導(dǎo)致誤判,讓這個(gè)節(jié)點(diǎn)下線,產(chǎn)生其他不必要的后果;設(shè)置的太長(zhǎng),會(huì)導(dǎo)致判斷“遲緩”,所以需要綜合各種情況來(lái)權(quán)衡和設(shè)定。

HDFS 就是使用的這種心跳機(jī)制。

(2)累積失效檢測(cè)機(jī)制

隨著網(wǎng)路負(fù)載的加大,Server 心跳的接收時(shí)間可能會(huì)大于上限值 T;但當(dāng)網(wǎng)絡(luò)壓力減少時(shí),心跳接收時(shí)間又會(huì)小于 T ,如果用一成不變的T  來(lái)反映心跳狀況,則會(huì)造成判斷”遲緩“或誤判。這個(gè)時(shí)候我們可以計(jì)算心跳延遲的概率,用這個(gè)概率來(lái)判斷是否發(fā)生故障,提高準(zhǔn)確性。

二、DataNode 是如何向 NameNode 發(fā)送心跳的

我們從 hadoop 源碼看 DataNode 是如何發(fā)送心跳的

1、從 DataNode 類(lèi)的 main 方法開(kāi)始

DataNode是怎么向NameNode發(fā)送心跳得

2、創(chuàng)建 DataNode

DataNode是怎么向NameNode發(fā)送心跳得

3、實(shí)例化 DataNode

DataNode是怎么向NameNode發(fā)送心跳得

4、創(chuàng)建實(shí)例

DataNode是怎么向NameNode發(fā)送心跳得

5、 new 了 DataNode

DataNode是怎么向NameNode發(fā)送心跳得

6、 這個(gè)方法構(gòu)造函數(shù)有點(diǎn)長(zhǎng),拉到最下面

DataNode是怎么向NameNode發(fā)送心跳得

7、然后來(lái)到這個(gè)方法里

這個(gè)方法表面看起來(lái)是刷新 NameNode,實(shí)際上里面做了兩件事情,把自己注冊(cè)到 NameNode 上,另外一件事情是向 NameNode  定時(shí)發(fā)送心跳。

DataNode是怎么向NameNode發(fā)送心跳得

8、點(diǎn)進(jìn)去,現(xiàn)在是在 BlockPoolManager 里面

DataNode是怎么向NameNode發(fā)送心跳得

9、再來(lái)到這個(gè)方法里

DataNode是怎么向NameNode發(fā)送心跳得

10、發(fā)現(xiàn)它在遍歷這個(gè) BPOfferService

DataNode是怎么向NameNode發(fā)送心跳得

這里大致說(shuō)明一下 offerServices 是個(gè)什么數(shù)據(jù)結(jié)構(gòu)。

用一張圖來(lái)表示吧

DataNode是怎么向NameNode發(fā)送心跳得

那個(gè) offerServices 其實(shí)裝的就是最左邊的 BPOfferService。

每個(gè) BPOfferService 里面有兩個(gè) BpServiceActor,每個(gè) BpServiceActor 對(duì)應(yīng)一個(gè) NameNode。

如果是上圖中的高可用,那么一主一備兩個(gè) NameNode,分別對(duì)應(yīng)一個(gè) BpServiceActor。

所以遍歷 offerService 其實(shí)就是在遍歷整個(gè)集群每個(gè)聯(lián)邦的每個(gè) NameNode 節(jié)點(diǎn)。

11、開(kāi)始遍歷(當(dāng)前類(lèi):BpOfferService)

DataNode是怎么向NameNode發(fā)送心跳得

12、線程 start(當(dāng)前類(lèi):BPServiceActor)

DataNode是怎么向NameNode發(fā)送心跳得

再點(diǎn)進(jìn)去已經(jīng)是 Thread 的方法了,可見(jiàn)它其實(shí)是個(gè)線程。

那我們應(yīng)該看這個(gè)類(lèi)的 run 方法。

13、線程的運(yùn)行內(nèi)容

run 方法的上半部分是往 NameNode 注冊(cè),下半部分是發(fā)送心跳

DataNode是怎么向NameNode發(fā)送心跳得

14、發(fā)送心跳

DataNode是怎么向NameNode發(fā)送心跳得

可以看到這是一個(gè) while 循環(huán),每隔一段時(shí)間(dnConf.heartBeatInterval = 3秒)就會(huì)執(zhí)行一次

可以看到 DataNode 的心跳就是采用了周期性檢測(cè)機(jī)制,每隔 3 s ,往所有的 NameNode 發(fā)送心跳。

15、再點(diǎn)進(jìn)去,已經(jīng)是 NameNode 的 proxy 代理方法了。

DataNode是怎么向NameNode發(fā)送心跳得

因?yàn)樗强?rpc 通信的,此時(shí) DataNode 是客戶端,NameNode 是服務(wù)端。

這個(gè)時(shí)候,我們應(yīng)該看 NameNodeRpcServer 方法,具體的實(shí)現(xiàn)是在這個(gè)方法里的。

16、看服務(wù)端的處理,此時(shí)我們?cè)?NameNodeRpcServer 類(lèi)中

DataNode是怎么向NameNode發(fā)送心跳得

這個(gè)方法里的具體就不看了,(其實(shí)也很重要的的)。

大致就是把 DataNode 心跳包的基本信息(比如本節(jié)點(diǎn)的存儲(chǔ)容量信息等)更新到 NameNode 對(duì)應(yīng)的結(jié)構(gòu)中。

并且更新上一次心跳時(shí)間,以便下次判斷 DataNode 是否心跳超時(shí)。

其實(shí)心跳就是這么樸素了。

最后,NameNode 會(huì)在心跳的響應(yīng)中,告訴 DataNode 應(yīng)該做些什么事情,比如把本節(jié)點(diǎn)的 Block 備份到其他節(jié)點(diǎn)上去。

也就是說(shuō),NameNode 本身不會(huì)和 DataNode 通信,而是在心跳信息中告訴 DataNode 該做什么。

感謝各位的閱讀,以上就是“DataNode是怎么向NameNode發(fā)送心跳得”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)DataNode是怎么向NameNode發(fā)送心跳得這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI