您好,登錄后才能下訂單哦!
本篇內容主要講解“Hadoop的源碼分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Hadoop的源碼分析”吧!
一、閱讀 HDFS 源碼的緣由
HDFS 是大數據的最基礎的設施了,幾乎所有的離線存儲都在 HDFS 上。
但是在大規模 HDFS 集群中,下面的問題通常會讓我們無比頭疼:
元數據的量級超過億級之后,NameNode 的內存也會變得非常巨大,啟動和維護都變的異常困難;
如何保障 HDFS 的高可用?
NameNode 里面發生長時間的 GC 之后,導致 NameNode 進程退出,該如何解決?
如何優化 DataNode 的鎖粒度,讓其性能更高效?
以上種種問題,都需要我們閱讀源碼,甚至要修改它的源碼才能解決。
所以雖然閱讀源碼非常痛苦,但是這個坎還是得過的。
二、如何閱讀 Hadoop 這樣的百萬行代碼的開源項目
首先 hadoop 是用 java 寫的,所以一些 java 基礎知識必不可少,比如鎖,線程,設計模式,java 虛擬機,java io,不求很深入,基礎得知道。
其次,不能一行行的讀代碼,這樣很容易迷失在無邊際的代碼中,逃不出來,最后很容易就放棄了。
最后,以具體場景來驅動代碼閱讀。比如本文就是以 NameNode 的啟動過程,來驅動代碼閱讀的。并且把關鍵的流程節點和類用流程圖記錄下來。
三、源碼走讀
找到 NameNode 類
從 main 方法開始,創建 NameNode
進入這個方法:
有很多的 switch case ,由于我們啟動命令是 hadoop-daemon.sh start namenode,所以直接運行到 default 里面:
這是個比較重要的方法,實例化:
實例化方法里,有個比較重要的操作,startHttpServer(conf),啟動 50070 端口,就是我們 50070 那個界面:
進去,使用 ip 和 端口創建了 HttpServer
再來看這個 start 方法
進入 start 方法,發現創建了一個 HttpServer2,這是 Hadoop 自己封裝的服務
然后綁定了很多 Servlet,每個 Servlet 都是一個功能
可以看到畫紅線的,就是每個功能的地址。如果想看每個功能怎么實現的,可以點進去 Servlet,看它的 doGet 或者 doPost 或者 doPut 方法。
看完了這個,再退回到 NameNode 類中,然后就是去加載元數據(先不細看)
然后是創建 RPC 服務端,啟動一個服務端,給別的組件調用
看這個方法:
看這個地方,這個就是使用 hadoop 的 RPC ,來創建一個 RPC 服務端了。此時我們在 NameNodeRpcServer 類中。
創建了之后,再回到 NameNode 中,發現這個 NameNodeRpcServer 是 NameNode 類的一個屬性,意思是,NameNode 委托這個類去啟動了 NameNodeRpcServer,在設計模式中,屬于組合。
然后我們再來看這個 NameNodeRpcServer ,實現了很多的協議:
我們嘗試在 ClientProtocol 中,找一找是否有創建目錄的方法。
發現是有的,所以 NameNodeRpcServer 會去實現這個方法的。
到時候 NameNode 啟動之后,就會往外提供服務了。
然后我們再回到 NameNode 類,看最后一些功能:
startCommonServices,主要做了兩件事情,進行資源監察,檢查磁盤夠不夠;檢查是否可以退出安全模式。
這個方法會檢查配置文件中 fsimage 的目錄 和 editlog 的目錄磁盤資源是否充足。
最終會把磁盤是否足夠的布爾值賦值給這個變量。
private volatile boolean hasResourcesAvailable = false;
然后會判斷是否進入安全模式:
進入這個方法中:
這個 getCompleteBlocksTotal() 返回的是能正常使用的 Block 個數。
這個是怎么算的呢?
在 HDFS 中,存在兩種類型的 Block,一種是 Complete 類型,即為正常可用的 Block;另一種是 underconstruction 類型,處于正在構建的 Block,相減,就是正常可用的 Block 個數了。
然后進入 checkMode 方法
進去之后,有一個 needEnter() 方法,這個方法里,判斷了是否進入安全模式
這里面有三個進入安全模式的條件:
我們來看第一個條件:
threshold != 0 && blockSafe < blockThreshold
threshold 默認配置是 0.999 ,不等于0;
blockSafe 可以在當前類中搜索一下。
這個就表示,DataNode 每次心跳都要和 NameNode 匯報 自己的 Block 個數,每次匯報,這個值都會加 1.
如果 DataNode 匯報上來的 Block 個數小于所有可用的 Block 個數,就進入安全模式。
再來看第二個條件:
datanodeThreshold != 0 && getNumLiveDataNodes() < datanodeThreshold
這個條件表示,所有可用的 DataNode 小于配置的個數,則進入安全模式。
但是 datanodeThreshold 的默認配置值是 0,所以這個條件不啟用。
第三個條件:
!nameNodeHasResourcesAvailable()
這個方法就是我們前面檢查資源時,賦值出來的變量:
如果 NameNode 的 images 和 editlogs 所在的目錄,磁盤空間不足,則進入安全模式。
四、流程圖
最后我們用一個流程圖來總結一下 NameNode 啟動流程:
NameNode啟動流程
到此,相信大家對“Hadoop的源碼分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。