一文讀懂為什麼HDFS更適合存儲大文件

一文讀懂為什麼HDFS更適合存儲大文件

HDFS(分佈式文件系統)是大數據生態圈中不可或缺的一部分,作為大數據生態圈中的存儲層,HDFS能夠存儲結構及非結構化的數據,數據吞吐量大但延時較高,一般用於離線批處理。此外,由於其架構設計,HDFS更適合存儲大文件。要了解為什麼HDFS更適合存儲大文件,首先需要了解其架構設計。

一文讀懂為什麼HDFS更適合存儲大文件

HDFS架構設計

HDFS採用主從架構設計,由NameNode、SecondaryNameNode及DataNode組成。其中,NameNode為主節點,負責維護文件系統命名空間,DataNode為工作節點,負責數據存儲及心跳機制(定時向NameNode發送心跳),SecondaryNameNode為備份節點,定時合併NameNode中的元數據信息。

一文讀懂為什麼HDFS更適合存儲大文件

DataNode主要負責文件的存儲,其基本存儲單位為數據塊(block,一般為128M)。DataNode數據塊比磁盤的塊(512B)大,其目的是為了最小化尋址開銷,如果塊足夠大,從磁盤傳輸數據的時間會明顯大於定位這個塊開始位置需要的時間。為了防止數據丟失,HDFS會對block進行數據備份,在其他的DataNode節點上拷貝一份相同的block(備份數默認為3)。數據備份節點選擇採用機架感知策略,第一個副本在客戶端相同的節點(如果客戶端是集群外的一臺機器,就隨機選擇節點,但是系統會避免挑選太滿或太忙的節點),第二個副本放在隨機選擇的不同機架的節點上,第三個副本放在與第二個副本同機架的另一個節點上。

<code>root@test:~/hadoop/tmp/dfs# tree name
name
├── current
│ ├── edits_0000000000000000001-0000000000000000002
│ ├── edits_0000000000000000003-0000000000000000003
│ ├── edits_0000000000000000004-0000000000000000005
│ ├── edits_0000000000000000006-0000000000000000006
│ ├── edits_0000000000000000007-0000000000000000008
│ ├── edits_0000000000000000009-0000000000000000010
│ ├── edits_0000000000000000011-0000000000000000012
│ ├── edits_0000000000000000013-0000000000000000014
│ ├── edits_0000000000000000015-0000000000000000016
│ ├── edits_0000000000000000017-0000000000000000018
│ ├── edits_0000000000000000019-0000000000000000020
│ ├── edits_inprogress_0000000000000000021
│ ├── fsimage_0000000000000000000
│ ├── fsimage_0000000000000000000.md5
│ ├── fsimage_0000000000000000020
│ ├── fsimage_0000000000000000020.md5
│ ├── seen_txid
│ └── VERSION
└── in_use.lock
/<code>

NameNode負責維護文件系統樹及整棵樹內所有的文件和目錄。NameNode保存元信息的種類包括文件目錄之間的層級關係、文件目錄的所有者及其權限、每個文件塊的名稱及文件由那些塊組成。NameNode元信息保存在內存中,NameNode元信息並不包括每個塊的位置信息,而是保存文件、block及DataNode之間的映射關係。

一文讀懂為什麼HDFS更適合存儲大文件

一般來說,一條元信息記錄會佔用200byte內存空間。假設塊大小為64M,備份數量是3,那麼1G大小的文件將佔用16*3個文件塊。如果現在有1000個1M大小的文件,則會佔用1000*3個文件塊(多個文件不能放到一個塊中)。可以發現,文件越小,存儲同等大小的文件所需的元信息就越多,對NameNode內存要求更大。因此,HDFS更適合存儲大文件。


分享到:


相關文章: