自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何閱讀百萬(wàn)行 Hadoop 的源碼?

大數(shù)據(jù) Hadoop
首先 hadoop 是用 java 寫(xiě)的,所以一些 java 基礎(chǔ)知識(shí)必不可少,比如鎖,線程,設(shè)計(jì)模式,java 虛擬機(jī),java io,不求很深入,基礎(chǔ)得知道。

[[387391]]

本文轉(zhuǎn)載自微信公眾號(hào)「KK架構(gòu)師」,作者wangkai。轉(zhuǎn)載本文請(qǐng)聯(lián)系KK架構(gòu)師公眾號(hào)。

一、閱讀 HDFS 源碼的緣由

HDFS 是大數(shù)據(jù)的最基礎(chǔ)的設(shè)施了,幾乎所有的離線存儲(chǔ)都在 HDFS 上。

但是在大規(guī)模 HDFS 集群中,下面的問(wèn)題通常會(huì)讓我們無(wú)比頭疼:

  • 元數(shù)據(jù)的量級(jí)超過(guò)億級(jí)之后,NameNode 的內(nèi)存也會(huì)變得非常巨大,啟動(dòng)和維護(hù)都變的異常困難;
  • 如何保障 HDFS 的高可用?
  • NameNode 里面發(fā)生長(zhǎng)時(shí)間的 GC 之后,導(dǎo)致 NameNode 進(jìn)程退出,該如何解決?
  • 如何優(yōu)化 DataNode 的鎖粒度,讓其性能更高效?

以上種種問(wèn)題,都需要我們閱讀源碼,甚至要修改它的源碼才能解決。

所以雖然閱讀源碼非常痛苦,但是這個(gè)坎還是得過(guò)的。

二、如何閱讀 Hadoop 這樣的百萬(wàn)行代碼的開(kāi)源項(xiàng)目

首先 hadoop 是用 java 寫(xiě)的,所以一些 java 基礎(chǔ)知識(shí)必不可少,比如鎖,線程,設(shè)計(jì)模式,java 虛擬機(jī),java io,不求很深入,基礎(chǔ)得知道。

其次,不能一行行的讀代碼,這樣很容易迷失在無(wú)邊際的代碼中,逃不出來(lái),最后很容易就放棄了。

最后,以具體場(chǎng)景來(lái)驅(qū)動(dòng)代碼閱讀。比如本文就是以 NameNode 的啟動(dòng)過(guò)程,來(lái)驅(qū)動(dòng)代碼閱讀的。并且把關(guān)鍵的流程節(jié)點(diǎn)和類(lèi)用流程圖記錄下來(lái)。

三、源碼走讀

找到 NameNode 類(lèi)

從 main 方法開(kāi)始,創(chuàng)建 NameNode

進(jìn)入這個(gè)方法:

有很多的 switch case ,由于我們啟動(dòng)命令是 hadoop-daemon.sh start namenode,所以直接運(yùn)行到 default 里面:

這是個(gè)比較重要的方法,實(shí)例化:

實(shí)例化方法里,有個(gè)比較重要的操作,startHttpServer(conf),啟動(dòng) 50070 端口,就是我們 50070 那個(gè)界面:

進(jìn)去,使用 ip 和 端口創(chuàng)建了 HttpServer

再來(lái)看這個(gè) start 方法

進(jìn)入 start 方法,發(fā)現(xiàn)創(chuàng)建了一個(gè) HttpServer2,這是 Hadoop 自己封裝的服務(wù)

然后綁定了很多 Servlet,每個(gè) Servlet 都是一個(gè)功能

可以看到畫(huà)紅線的,就是每個(gè)功能的地址。如果想看每個(gè)功能怎么實(shí)現(xiàn)的,可以點(diǎn)進(jìn)去 Servlet,看它的 doGet 或者 doPost 或者 doPut 方法。

看完了這個(gè),再退回到 NameNode 類(lèi)中,然后就是去加載元數(shù)據(jù)(先不細(xì)看)

然后是創(chuàng)建 RPC 服務(wù)端,啟動(dòng)一個(gè)服務(wù)端,給別的組件調(diào)用

看這個(gè)方法:

看這個(gè)地方,這個(gè)就是使用 hadoop 的 RPC ,來(lái)創(chuàng)建一個(gè) RPC 服務(wù)端了。此時(shí)我們?cè)?NameNodeRpcServer 類(lèi)中。

創(chuàng)建了之后,再回到 NameNode 中,發(fā)現(xiàn)這個(gè) NameNodeRpcServer 是 NameNode 類(lèi)的一個(gè)屬性,意思是,NameNode 委托這個(gè)類(lèi)去啟動(dòng)了 NameNodeRpcServer,在設(shè)計(jì)模式中,屬于組合。

然后我們?cè)賮?lái)看這個(gè) NameNodeRpcServer ,實(shí)現(xiàn)了很多的協(xié)議:

我們嘗試在 ClientProtocol 中,找一找是否有創(chuàng)建目錄的方法。

發(fā)現(xiàn)是有的,所以 NameNodeRpcServer 會(huì)去實(shí)現(xiàn)這個(gè)方法的。

到時(shí)候 NameNode 啟動(dòng)之后,就會(huì)往外提供服務(wù)了。

然后我們?cè)倩氐?NameNode 類(lèi),看最后一些功能:

startCommonServices,主要做了兩件事情,進(jìn)行資源監(jiān)察,檢查磁盤(pán)夠不夠;檢查是否可以退出安全模式。

這個(gè)方法會(huì)檢查配置文件中 fsimage 的目錄 和 editlog 的目錄磁盤(pán)資源是否充足。

最終會(huì)把磁盤(pán)是否足夠的布爾值賦值給這個(gè)變量。

  1. private volatile boolean hasResourcesAvailable = false

然后會(huì)判斷是否進(jìn)入安全模式:

進(jìn)入這個(gè)方法中:

這個(gè) getCompleteBlocksTotal() 返回的是能正常使用的 Block 個(gè)數(shù)。

這個(gè)是怎么算的呢?

在 HDFS 中,存在兩種類(lèi)型的 Block,一種是 Complete 類(lèi)型,即為正常可用的 Block;另一種是 underconstruction 類(lèi)型,處于正在構(gòu)建的 Block,相減,就是正常可用的 Block 個(gè)數(shù)了。

然后進(jìn)入 checkMode 方法

進(jìn)去之后,有一個(gè) needEnter() 方法,這個(gè)方法里,判斷了是否進(jìn)入安全模式

這里面有三個(gè)進(jìn)入安全模式的條件:

我們來(lái)看第一個(gè)條件:

  1. threshold != 0 && blockSafe < blockThreshold 

threshold 默認(rèn)配置是 0.999 ,不等于0;

blockSafe 可以在當(dāng)前類(lèi)中搜索一下。

這個(gè)就表示,DataNode 每次心跳都要和 NameNode 匯報(bào) 自己的 Block 個(gè)數(shù),每次匯報(bào),這個(gè)值都會(huì)加 1.

如果 DataNode 匯報(bào)上來(lái)的 Block 個(gè)數(shù)小于所有可用的 Block 個(gè)數(shù),就進(jìn)入安全模式。

再來(lái)看第二個(gè)條件:

  1. datanodeThreshold != 0 && getNumLiveDataNodes() < datanodeThreshold 

這個(gè)條件表示,所有可用的 DataNode 小于配置的個(gè)數(shù),則進(jìn)入安全模式。

但是 datanodeThreshold 的默認(rèn)配置值是 0,所以這個(gè)條件不啟用。

第三個(gè)條件:

  1. !nameNodeHasResourcesAvailable() 

這個(gè)方法就是我們前面檢查資源時(shí),賦值出來(lái)的變量:

如果 NameNode 的 images 和 editlogs 所在的目錄,磁盤(pán)空間不足,則進(jìn)入安全模式。

四、流程圖

最后我們用一個(gè)流程圖來(lái)總結(jié)一下 NameNode 啟動(dòng)流程:

NameNode啟動(dòng)流程

五、小結(jié)

主要有三大塊:

1、啟動(dòng) HttpServer ,可以查看 50070 端口;

2、管理和加載元數(shù)據(jù);

3、啟動(dòng) RPCServer,使其他組件可以調(diào)用;

4、檢查磁盤(pán)空間;

5、判斷是否進(jìn)入安全模式;

 

責(zé)任編輯:武曉燕 來(lái)源: KK架構(gòu)師
相關(guān)推薦

2018-11-16 16:35:19

Java源碼編程語(yǔ)言

2017-04-13 19:26:21

2020-12-07 11:29:24

ReactVueVue3

2017-07-17 09:54:43

代碼C語(yǔ)言功能

2021-08-02 09:50:47

Vetur源碼SMART

2021-12-20 07:58:59

GitHub源碼代碼

2017-03-16 11:39:33

Openstack源碼姿勢(shì)

2013-12-24 10:05:04

memcached

2018-07-31 14:49:45

編程語(yǔ)言Java源碼

2019-08-14 16:52:23

閱讀源碼工具JDK

2018-03-28 16:10:23

閱讀源碼境界

2014-07-29 09:44:58

jQuery源碼

2021-11-10 15:10:17

操作系統(tǒng)華為代碼

2023-02-06 21:58:23

2021-02-18 22:18:50

TCP 服務(wù)器源碼

2022-10-08 08:01:17

Spring源碼服務(wù)

2012-02-14 14:05:59

JavaSpring

2017-04-05 16:40:45

2013-04-02 10:51:09

HadoopHadoop源碼

2018-12-10 23:19:12

人工智能機(jī)器學(xué)習(xí)技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)