最近在跟著一個大佬學習Hadoop底層源碼及架構等知識點,覺得有必要記錄下來這個學習過程。想到了這個廢棄已久的blog賬號,決定重新開始更新。 主要分以下幾步來進行源碼學習: 一、搭建源碼閱讀環境二、源碼項目結構概覽及hdfs源碼包結構簡介三、NameNode介紹 第一步,搭建源碼閱讀環境。 把Ha ...
最近在跟著一個大佬學習Hadoop底層源碼及架構等知識點,覺得有必要記錄下來這個學習過程。想到了這個廢棄已久的blog賬號,決定重新開始更新。
主要分以下幾步來進行源碼學習:
一、搭建源碼閱讀環境
二、源碼項目結構概覽及hdfs源碼包結構簡介
三、NameNode介紹
第一步,搭建源碼閱讀環境。
把Hadoop源碼包導入到開發工具,eclipse或者idea都行。這裡我的環境是mac os,使用的工具是idea,Hadoop版本為2.6.5。
首先,解壓縮Hadoop源碼包,可以選擇移動解壓之後的源碼包到idea工作空間
然後打開idea,選擇import project,指定工作空間里的源碼包路徑
選擇maven,下一步
勾選紅框內選項,下一步。
勾選紅框內選項選項,下一步。
繼續下一步,
繼續下一步,
點擊完成,等待maven下載依賴,然後就導入成功了。
需要註意的是導入的時候maven需要下載很多依賴,所以這個過程可能會稍微長一些,耐心等候即可。
項目結構如下,
參考鏈接:https://blog.csdn.net/twj0823/article/details/84560878
第二步,項目結構概覽及hdfs項目包簡介。
Hadoop是一個龐大的項目,源碼包導入idea之後,可以發現裡面又按照功能分為很多不同的小項目,比較耳熟能詳的有hdfs、mapreduce、yarn等,
還有別的一些功能性的組件以及新增的特性功能。點開Packages視圖,包結構如下:
此處暫時只針對hdfs模塊的NameNode進行分析。點開hadoop-hdfs之後,發現也是按照功能進行分包的結構:
可以自己查看一下各個包里的內容。namenode屬於伺服器上的一個進程,所以是在server包下。server包除了有namenode,還有datanode、
blockmanagement、common、protocol等包。先把目標鎖定在namenode,裡面大致有ha高可用、快照處理、啟動進程、網路資源等模塊
第三步,NameNode類簡單介紹。
NameNode類在下邊一堆的類文件中間的位置,至此,目標終於找到,開始切入正題了。閱讀源碼是一個非常好的學習方法,不僅可以學習到底層的
技術實現機制,還可以通過查看核心代碼梳理整個調用流程。
首先,要學會看註釋,除了通過梳理核心代碼流程可以得知整個代碼結構之外,通過註釋可以更清晰的知道代碼的意圖。比如看一段繁雜的代碼繞來繞去、
暈頭轉向,而註釋就是專門給人看的東西,幫助我們在看代碼的時候有一個大致的推測方向。
所以,NameNode的這段註釋已經很明白的說明瞭NameNode的功能和構成:
/********************************************************** * NameNode serves as both directory namespace manager and * "inode table" for the Hadoop DFS. There is a single NameNode * running in any DFS deployment. (Well, except when there * is a second backup/failover NameNode, or when using federated NameNodes.) * * The NameNode controls two critical tables: * 1) filename->blocksequence (namespace) * 2) block->machinelist ("inodes") * * The first table is stored on disk and is very precious. * The second table is rebuilt every time the NameNode comes up. * * 'NameNode' refers to both this class as well as the 'NameNode server'. * The 'FSNamesystem' class actually performs most of the filesystem * management. The majority of the 'NameNode' class itself is concerned * with exposing the IPC interface and the HTTP server to the outside world, * plus some configuration management. **********************************************************/
上面兩段話 主要是說,NameNode管理兩類數據:
1.filename -> blocksequence (namespace)
文件到block的映射,上傳的文件被切分為多個block(128m),這份映射數據就是namespace,存儲在磁碟上。
2.block -> machinelist (inodes)
block到datanode的映射,每個block都會分配給一個datanode,每個block還有3個副本,也就是每個block對應多個datanode,
這個映射數據就是inodes。在NameNode每次啟動的時候,由datanode彙報過來的。
最下麵一段話的字面意思是,NameNode主要由FSNamesystem、NameNode本身、NameNodeServer三部分構成。
其中,FSNamesystem是用來執行文件系統管理的,NameNode被用來處理外部的遠程調用,包括HTTP服務以及一些配置管理。
這段話想表達什麼意思呢?
FSNamesystem執行文件系統管理,這個好理解,就是負責管理元數據。
NameNode處理外部遠程調用以及Http服務怎麼理解?其實就是說,NameNode主要幹了兩件事情:
1.處理一些配置屬性,就是core-site.xml、hdfs-site.xml等文件里的配置;
2.啟動NameNodeServer(分為NameNodeHttpServer和NameNodeRpcServer),對外監聽某個埠,處理接收到的http/rpc請求。比如請求
這兩個server進行創建目錄、上傳/下載文件等一些操作。
以上就是NameNode的功能和組成的大概介紹。
然後,結合Linux上運行jar文件的經驗,查看該jar的進程,發現進程名字其實就是jar中被指定執行的Java類文件名。Hadoop集群的主節點NameNode
進程也是如此,由此想進一步知道NameNode的啟動流程,可以通過NameNode類的main()入口進去查看。下一篇繼續進行源碼深入剖析。