HDFS Datanode關於block檔案的管理

2021-05-11 04:58:23 字數 3213 閱讀 2688

資料檔案真正儲存的地方是在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大 如果小於要...