資料檔案真正儲存的地方是在datanode,當使用者需要填充檔案中某乙個block的實際資料內容時,就需要連線到datanode進行實際的block寫入操作,下面我們看一下datanode如何管理block,以及如何儲存block。
datanode
是通過檔案儲存block資料的
,datanode中有乙個
fsdatasetinte***ce
介面,這個介面的主要作用就是對block對應的實際資料檔案進行操作。
首先我們看一下這部分涉及的主要類關係:
/data1/dfs/data/這個目錄是我們配置的乙個儲存block對應的檔案的目錄,也就是對應乙個fsvolume,其中current目錄是我們真正存放block資料塊檔案的地方,其中還有乙個tmp目錄,這個目錄主要臨時存放一些正在寫入的block資料檔案,成功寫入完成後這個臨時檔案就會從tmp目錄移動到current目錄。
看一下我們的配置檔案內容
可以看到我們配置了/data1/dfs/data/目錄做為我們資料儲存目錄之一。
下面我們看一下實際的/data1/dfs/data/current目錄下會有那些內容:
可以看到這個目錄主要存放了block資料檔案,block資料檔案的命名規則是blk_$blockid$,還有就是block檔案的元資料檔案,元資料檔案的命名規則是:blk_$blockid$_$時間戳$,同時大家可以看到很多累似subdir00命名的資料夾,這些資料夾其中存放的也是block資料檔案及其元資料檔案,hadoop規定每個目錄存放的block資料檔案個數是有限制的,達到限制之後就會新建sub子目錄進行存放,這些sub子目錄包括current目錄,都會和乙個fsdir物件對應。
我們來看一下fsdir物件,這個物件和檔案系統中的目錄是很相近的概念,他的主要作用就是管理乙個目錄下的所有與block相關的檔案。
我們先看乙個這個類的主要屬性:
//這個物件對應的檔案目錄物件。
file
dir;
//這個目錄下的子資料夾物件
fsdir
children;
這個物件在進行例項化構造的過程就會遍歷資料夾下的檔案,判斷哪些是目錄,然後生成相應的
fsdir
新增到children陣列中。
主要方法:
void
getvolumemap(hashmapvolumemap,
fsvolume volume)
這個方法的主要目的就是遍歷整個目錄,得到所有block檔案列表,並新增所有block的記錄到
fsdataset
的volumemap
屬性中,引數中的
volumemap
傳入的正是f
sdataset的
volumemap
屬性,這個物件儲存block與
datanodeblockinfo
的對映關係,便於通過block查詢具體的block檔案資訊。
datanodeblockinfo物件主要儲存了block屬於哪乙個
fsvolume
,以及block塊實際的存放檔案是哪個。 }
file blockfiles =
dir.listfiles();
for(int
i = 0; i < blockfiles.
length
; i++)
} }
volumes
相對來說比較簡單,他就是乙個fsvolume集合,並封裝了對所有volume的操作,比如:
getblockreport
()這個方法,就是得到所有的block列表,上報給namenode。有了volumes這個集合物件,類似這樣的操作就可以封裝起來,方便後續操作。
ongoingcreates
這個物件主要儲存了正在建立的block列表,這個物件中的block表示使用者正在進行該block檔案資料上傳操作,這個物件中包含
activefile
物件的例項
,我們先看一下
activefile
物件,這個物件中有兩個關鍵屬性:1.物件對應的資料檔案。2.正在操作這個檔案的執行緒列表。
final
file
file;
final
list
threads
= new
arraylist(2);
儲存執行緒列表的主要目的是:
在進行block檔案寫入操作時,如果datanode收到了對這個block進行recoverblock的請求後,需要先interrupt所有正在寫入這個block檔案的執行緒。
我們先看一下檔案資料的接受流程。
在接下來的
3.2.2
章節我們會詳細介紹datanode接收資料的協議
,下文中會提到datanode構建乙個
blockreceiver
例項,進行實際資料的接受操作。
blockreceiver
在構建例項過程中會首先通過如下方法:
streams
= datanode.
data
.writetoblock(block, isrecovery);
開啟block資料寫入datanode本地檔案的通道,以便datanode接收到block資料塊兒內容以後將資料內容寫入磁碟。第一步我們可能需要了解
blockwritestreams
這個物件,因為
writetoblock
會返回blockwritestreams
物件例項。
static
class
blockwritestreams
我們可以看到這個物件包含兩個重要的屬性:
dataout
,checksumout
。從字面意思我們也可以揣測到,這兩個outputstream物件,乙個用來寫入block資料,乙個用來寫入block資料中的checksum資料。
接下來我們詳細分析一下這個方法:
public
blockwritestreams writetoblock(block b,
boolean
isrecovery)
...
return
createblockwritestreams(f, metafile); }
主要是建立乙個臨時檔案和乙個存放元資料資訊的臨時檔案,然後開啟兩個檔案將返回的outputstream返回給前端。
HDFS DataNode公升級過程
公升級需要重點考慮的幾個問題 datastorage重要的功能就是管理磁碟儲存空間的生命週期。公升級是磁碟儲存空間生命週期管理中最重要的乙個環節,尤其是對於hdfs這樣的分布式儲存系統,公升級需要重點考慮以下幾個問題。版本相容性問題 不同版本之間相容性的設計,高版本是否需要相容低版本?不同元件之間,...
HDFS DataNode的目錄結構
目標 掌握datanode的目錄結構 和namenode不同的是,datanode的儲存目錄是初始階段自動建立的,不需要額外格式化。在 export servers hadoop 2.6.0 cdh5.14.0 hadoopdatas datanodedatas current這個目錄下檢視版本號 ...
關於B樹 B 樹 B 樹 總結
二叉搜尋樹 特點 1 所有非葉子節點最多2個孩子,廢話,二叉樹 2 所有節點,每個節點儲存乙個值 3 父親節點的左孩子樹的節點比它小,右孩子節點的值比它大。查詢 其實,我一下子想到的是二分查詢。先查詢根,如果相等則找到,如果大於要查詢的值,則查詢右孩子樹 因為右孩子數儲存的值比root大 如果小於要...