一個典型的HDFS系統包括一個NameNode和多個DataNode。NameNode維護名字空間;而DataNode儲存資料區塊。
DataNode負責儲存資料,一個資料區塊在多個DataNode中有備份;而一個DataNode對於一個塊最多隻包含一個備份。所以我們可以簡單地認為DataNode上存了資料區塊ID和資料區塊內容,以及他們的映射關係。
一個HDFS叢集可能包含上千DataNode節點,這些DataNode定時和NameNode通訊,接受NameNode的指令。為了減輕NameNode的負擔,NameNode上並不永久儲存那個DataNode上有那些資料區塊的資訊,而是通過DataNode啟動時的上報,來更新NameNode上的映射表。
DataNode和NameNode建立串連以後,就會不斷地和NameNode保持心跳。心跳的返回其還也包含了NameNode對DataNode的一些命令,如刪除資料庫或者是把資料區塊複製到另一個DataNode。應該注意的是:NameNode不會發起到DataNode的請求,在這個通訊過程中,它們是嚴格的用戶端/伺服器架構。
DataNode當然也作為伺服器接受來自用戶端的訪問,處理資料區塊讀/寫請求。DataNode之間還會相互連信,執行資料區塊複製任務,同時,在用戶端做寫操作的時候,DataNode需要相互配合,保證寫操作的一致性。
下面我們就來具體分析一下DataNode的實現。DataNode的實現包括兩部分,一部分是對本機資料塊的管理,另一部分,就是和其他的實體打交道。我們先來看本機資料塊管理部分。
安裝Hadoop的時候,我們會指定對應的資料區塊存放目錄,當我們檢查資料區塊存放目錄目錄時,我們回傳現下面有個叫dfs的目錄,所有的資料就存放在dfs/data裡面。
其中有兩個檔案,storage裡存的東西是一些出錯資訊,貌似是版本不對…云云。in_use.lock是一個空檔案,它的作用是如果需要對整個系統做排斥操作,應用應該擷取它上面的一個鎖。
接下來是3個目錄,current存的是當前有效資料區塊,detach存的是快照(snapshot,目前沒有實現),tmp儲存的是一些操作需要的臨時資料區塊。
但我們進入current目錄以後,就會發現有一系列的資料區塊檔案和資料區塊中繼資料檔案。同時還有一些子目錄,它們的名字是subdir0到subdir63,子目錄下也有資料區塊檔案和資料區塊中繼資料。這是因為HDFS限定了每個目錄存放資料區塊檔案的數量,多了以後會建立子目錄來儲存。
資料區塊檔案顯然儲存了HDFS中的資料,資料區塊最大可以到64M。每個資料區塊檔案都會有對應的資料區塊中繼資料檔案。裡面存放的是資料區塊的校正資訊。下面是資料區塊檔案名稱和它的中繼資料檔案名稱的例子:
blk_3148782637964391313
blk_3148782637964391313_242812.meta
上面的例子中,3148782637964391313是資料區塊的ID號,242812是資料區塊的版本號碼,用於一致性檢查。
在current目錄下還有下面幾個檔案:
VERSION,儲存了一些檔案系統的元資訊。
dncp_block_verification.log.curr和dncp_block_verification.log.prev,它記錄了一些DataNode對檔案系定時統做一致性檢查需要的資訊。
更多請看:http://caibinbupt.iteye.com/blog/282580
作者是寫了一個系列,我認為其中這一節即第9節 值得一看,其他是講源碼的。