<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【源碼解讀】峰哥帶你讀 NameNode 啟動過程的源碼

          共 2767字,需瀏覽 6分鐘

           ·

          2021-03-24 11:57

          點(diǎn)擊上方 "大數(shù)據(jù)肌肉猿"關(guān)注, 星標(biāo)一起成長

          后臺回復(fù)【加群】,進(jìn)入高質(zhì)量學(xué)習(xí)交流群

          2021年大數(shù)據(jù)肌肉猿公眾號獎勵制度

          一、閱讀 HDFS 源碼的緣由

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

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

          • 元數(shù)據(jù)的量級超過億級之后,NameNode 的內(nèi)存也會變得非常巨大,啟動和維護(hù)都變的異常困難;

          • 如何保障 HDFS 的高可用?

          • NameNode 里面發(fā)生長時間的 GC 之后,導(dǎo)致 NameNode 進(jìn)程退出,該如何解決?

          • 如何優(yōu)化 DataNode 的鎖粒度,讓其性能更高效?

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

          所以雖然閱讀源碼非常痛苦,但是這個坎還是得過的。

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

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

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

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

          三、源碼走讀

          找到 NameNode 類

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


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


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


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


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


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


          再來看這個 start 方法


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


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


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


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


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



          看這個方法:


          看這個地方,這個就是使用 hadoop 的 RPC ,來創(chuàng)建一個 RPC 服務(wù)端了。此時我們在 NameNodeRpcServer 類中。


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


          然后我們再來看這個 NameNodeRpcServer ,實(shí)現(xiàn)了很多的協(xié)議:



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


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

          到時候 NameNode 啟動之后,就會往外提供服務(wù)了。

          然后我們再回到 NameNode 類,看最后一些功能:


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


          這個方法會檢查配置文件中 fsimage 的目錄 和 editlog 的目錄磁盤資源是否充足。

          最終會把磁盤是否足夠的布爾值賦值給這個變量。

          private volatile boolean hasResourcesAvailable = false;

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


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


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

          這個是怎么算的呢?


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

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


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


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


          我們來看第一個條件:

          threshold != 0 && blockSafe < blockThreshold

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

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


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

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

          再來看第二個條件:

          datanodeThreshold != 0 && getNumLiveDataNodes() < datanodeThreshold

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

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

          第三個條件:

          !nameNodeHasResourcesAvailable()

          這個方法就是我們前面檢查資源時,賦值出來的變量:


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

          四、流程圖

          最后我們用一個流程圖來總結(jié)一下 NameNode 啟動流程:

          NameNode啟動流程

          五、小結(jié)

          主要有三大塊:

          1、啟動 HttpServer ,可以查看 50070 端口;

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

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

          4、檢查磁盤空間;

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



          --end--


          掃描下方二維碼
          添加好友,備注【交流
          可私聊交流,也可進(jìn)資源豐富學(xué)習(xí)群


          更文不易,點(diǎn)個“在看”支持一下??

          瀏覽 40
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美变态拉屎操逼网站 | R四虎18| 国产日逼免费看 | 性爱视频黄色 | 免费A∨在线观看 |