hdfs的啟動過程和關閉過程都經過指令碼進行了封裝,只需要執行start-all.sh和stop-all.sh就可以。操作較簡單。下面針對啟動階段的原理和詳細過程進行說明,對關閉過程目前還沒有調研,所以暫缺。
hdfs的啟動分三步驟:
下面一一描述。
1. 初始化過程:獲取一些必要的引數值,初始化fsimage,fsnamesystem,namenode等類。這個過程在很多啟動描述中都被忽略,不是很重要。需要注意的是,這個過程在recover, format和finalize幾種啟動時的操作略有不同。
2. 構造configuration物件:該物件的具體建立過程不是很清楚,只知道其中包含了一些配置資訊的載入。所以應該是和配置資訊有關的。
3. 構造namenode物件:這是namenode啟動最重要的階段。namenode物件主要包括兩部分,乙個是server類成員物件,第二個是fsnamesystem類成員物件。
a) server成員的構造:server是namenode用於與client和datanode之間進行rpc通訊的服務端。namenode中有乙個或兩個server成員,由不同的hadoop版本決定,兩個的時候分別負責和client和datanode的通訊。
b) fsnamesystem的構造:server構造完成後,呼叫namenode的initialize方法,接下來的操作都在這個方法中完成。先是構造fsnamesystem物件,fsnamesystem物件就是namenode上元資料的真正的存放資料結構。它主要包括兩部分,第一部分是一些資料結構,包括
第二部分是fsdirectory物件,這裡存放著檔案系統的層次結構。
fsnamesystem物件構造的過程,首先初始化blocksmap等資料結構,然後載入fsimage檔案到類fsimage中,然後讀取edits檔案,利用fsimage和edits構造檔案系統層次結構。
q:fsimage檔案如何載入?
之所以要記錄fsimage的載入過程,是因為fsimage是啟動過程中耗時較大的乙個步驟,便於後續的研究。
1. 從fsimage逐行讀入目錄和檔案資訊;
2. 初始化元資料資訊;
3. 構造namespace名字空間映象;
4. 讀取block資訊,並填充到blocksmap中。
c) 啟動後台守護程序: 啟動一系列的後台守護程序,下面是簡單描述。
d) 啟動rpc server服務和web服務:namenode和datanode以及client之間的通訊都是通過rpc方式的,下面是簡單描述rpc的通訊過程。
listener獲取來自client或者datanode的請求,為該請求建立listener的乙個子類reader的物件。並建立connection類,加入到connectionlist中。處理connection物件,reader常見call物件,然後加入到calllist中。再取出,處理執行,然後將得到的response加入到responsequeue中,從rq中返回給client或者datanode,並關閉連線。
4. 進入安全模式:namenode物件構造完成後,namenode進入安全模式,在這個階段等待datanode的註冊。為什麼一定要在第3步以後呢,我覺得是因為只有rpc啟動後,datanode才能與namenode進行通訊,才能註冊。
5. 退出安全模式,啟動成功:在等待datanode註冊的過程中,namenode有乙個timeout設定,等待超時後,namenode就會預設已經沒有要註冊的datanode了,離開安全模式。
namenode正式啟動。
datanode的啟動包括兩個步驟,初始化過程和啟動過程。
1. 初始化過程:
a) 初始化過程的第一步,是datanode獲取並設定各種配置資訊。我認為datanode整理自己的block資訊並進行封裝,等待傳送給namenode就是在這一步進行的。
b) 然後向namenode傳送rpc請求,從namenode獲取namespaceid, version以及storageid等待資訊,然後再做一系列的初始化操作。
2. datanode啟動:
a) 首先是datanode向namenode註冊。
datanode通過datanodeprotocal協議進行註冊,向namenode傳送註冊資訊,包括服務位址,資訊查詢埠,客戶端訪問埠以及datanodeid等,還包括block_report塊資料;
namenode接收到資訊後(這時的namenode處在安全模式中,等待註冊),先檢驗datanode的版本,然後把datanode交給fsnamesystem處理;
fsnamesystem先驗證該datanode是否被允許掛載(通過dfs.hosts列表驗證),然後把datanode資料對映到元資料中,這裡主要是獲取block_report塊與datanode的對映關係,新增到blocksmap中[hx1] ,然後再把這個datanode新增到heartsbeats中進行監控。最後返回註冊資訊。
b) 啟動datanode執行緒。datanode執行緒實際上是在不斷呼叫offerservice,週期性向namenode傳送block_report和heartbeats,同時接受namenode的指令。
datanode啟動完成。
secondary namenode的過程沒有細看。分析一下,覺得其實它的啟動應該是有兩部分的,首先與namenode建立連線,註冊到namenode,並且從namenode同步當前的fsimage,edits等檔案資訊;第二部分,是啟動secondary namenode上用於輪訓的程序,定期執行檢查點的建立操作。
hdfs啟動完成。
hdfs啟動最耗時的步驟,是fsimage載入的過程和datanode註冊時block_report載入的過程。具體的情況需要結合原始碼以及簡單的測試來確定。
HDFS集群啟動過程詳解
hdfs的啟動過程和關閉過程都經過指令碼進行了封裝,只需要執行start all.sh和stop all.sh就可以。操作較簡單。下面針對啟動階段的原理和詳細過程進行說明,對關閉過程目前還沒有調研,所以暫缺。hdfs的啟動分三步驟 下面一一描述。1.初始化過程 獲取一些必要的引數值,初始化fsima...
HDFS啟動過程 安全模式
可以通過startup progress檢視hdfs的啟動過程 1載入檔案的元資訊fsimage 2載入操作日誌檔案edits 3操作檢查點 4自動進入安全模式,檢查資料塊的副本率是否滿足要求。當滿足要求後,退出安全模式 安全模式safemode是hdfs所處的一種特殊狀態。處於這種狀態時,hdfs...
HDFS中NameNode的啟動過程
namenode儲存檔案系統元資料映象,namenode在記憶體及磁碟上分別存在乙份元資料映象檔案,記憶體中元資料映象保證了hdfs檔案系統檔案訪問效率,磁碟上的元資料映象保證了hdfs檔案系統的安全性。namenode在磁碟上的檔案組成 fsimage檔案 儲存檔案系統至上次checkpoint為...