溫馨提示×

溫馨提示×

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

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

Hadoop的源碼分析

發(fā)布時間:2021-12-09 14:09:16 來源:億速云 閱讀:182 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Hadoop的源碼分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Hadoop的源碼分析”吧!

一、閱讀 HDFS 源碼的緣由

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

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

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

  • 如何保障 HDFS 的高可用?

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

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

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

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

二、如何閱讀 Hadoop 這樣的百萬行代碼的開源項目

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

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

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

三、源碼走讀

找到 NameNode 類

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

Hadoop的源碼分析

進入這個方法:

Hadoop的源碼分析

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

Hadoop的源碼分析

這是個比較重要的方法,實例化:

Hadoop的源碼分析

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

Hadoop的源碼分析

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

Hadoop的源碼分析

再來看這個 start 方法

Hadoop的源碼分析

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

Hadoop的源碼分析

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

Hadoop的源碼分析

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

Hadoop的源碼分析

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

Hadoop的源碼分析

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

Hadoop的源碼分析

Hadoop的源碼分析

看這個方法:

Hadoop的源碼分析

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

Hadoop的源碼分析

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

Hadoop的源碼分析

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

Hadoop的源碼分析

Hadoop的源碼分析

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

Hadoop的源碼分析

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

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

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

Hadoop的源碼分析

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

Hadoop的源碼分析

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

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

private volatile boolean hasResourcesAvailable = false;

然后會判斷是否進入安全模式:

Hadoop的源碼分析

進入這個方法中:

Hadoop的源碼分析

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

這個是怎么算的呢?

Hadoop的源碼分析

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

然后進入 checkMode 方法

Hadoop的源碼分析

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

Hadoop的源碼分析

這里面有三個進入安全模式的條件:

Hadoop的源碼分析

我們來看第一個條件:

threshold != 0 && blockSafe < blockThreshold

threshold 默認配置是 0.999 ,不等于0;

blockSafe 可以在當前類中搜索一下。

Hadoop的源碼分析

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

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

再來看第二個條件:

datanodeThreshold != 0 && getNumLiveDataNodes() < datanodeThreshold

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

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

第三個條件:

!nameNodeHasResourcesAvailable()

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

Hadoop的源碼分析

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

四、流程圖

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

Hadoop的源碼分析

NameNode啟動流程

到此,相信大家對“Hadoop的源碼分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)
推薦閱讀:
  1. hadoop的HA
  2. Hadoop的RPC

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

AI