官术网_书友最值得收藏!

3.3 HDFS文件存儲機制

在Hadoop中數據的存儲是由HDFS負責的,HDFS是Hadoop分布式計算的存儲基石,Hadoop的分布式文件系統和其他分布式文件系統有很多類似的特質。那么HDFS相比于其他的文件系統有什么特征呢?簡單總結如下。

1)對于整個集群有單一的命名空間。

2)數據一致性。適合一次寫入多次讀取的模型,客戶端在文件沒有被成功創建之前無法看到文件存在。

3)文件會被分割成多個文件塊,每個文件塊被分配存儲到數據節點上,而且根據配置會有復制文件塊來保證數據的安全性。

在Hadoop中數據存儲涉及HDFS的三個重要角色,分別為:名稱節點(NameNode)、數據節點(DataNode)、客戶端。

NameNode可以看作是分布式文件系統中的管理者,主要負責管理文件系統的命名空間、集群配置信息、存儲塊的復制。NameNode會在內存中存儲文件系統的Metadata,這些信息主要包括文件信息,即每一個文件對應的文件塊的信息,以及每一個文件塊在DataNode的信息。

DataNode是負責存儲文件數據的節點。HDFS中文件的存儲方式是將文件按塊(block)切分,默認一個block為64MB(該大小可配置)。若文件大小超過一個block的容量可能會被切分為多個block,并存儲在不同的DataNode上;若文件大小小于一個block的容量,則文件只有一個block,實際占用的存儲空間為文件大小容量加上一點額外的校驗數據。也可以這么說,一個文件至少由一個或多個block組成,而一個block僅屬于一個文件。block是一個邏輯概念對象,由DataNode基于本地文件系統來實現。每個block在本地文件系統中由兩個文件組成,第一個文件包含文件數據本身,第二個文件則記錄block的元信息(Metadata),如數據校驗和(checksum)。所以每一個block對象實際物理對應兩個文件,但DataNode不會將文件創建在同一個目錄下。因為本機文件系統可能不能高效地支持單目錄下的大量文件,DataNode會使用啟發式方法決定單個目錄下存放多少文件合適,并在適當時候創建子目錄。

文件數據存儲的可靠性依賴多副本保障,對于單一DataNode節點而言只需保證自己存儲的block是完整且無損壞的。DataNode會主動周期性地運行一個block掃描器(Scanner)通過比對checksum來檢查block是否損壞。另外還有一種被動的檢查方式,就是當讀取時檢查。DataNode是文件存儲的基本單元。它將block存儲在本地文件系統中,保存了block的Metadata,同時周期性地發送所有存在的block的報告給NameNode。Client(客戶端)就是需要獲取分布式文件系統文件的應用程序。數據存儲中的讀取和寫入過程如圖3-22所示。

圖3-22 HDFS存儲結構

從圖3-22可以看到,數據存儲過程中主要通過三個操作來說明NameNode、DataNode、Client之間的交互關系。根據圖3-22所示的內容簡單分析一下Hadoop存儲中數據寫入和讀取訪問的基本流程。

1.文件讀取HDFS的基本流程詳細過程查看3.4.1節

1)Client向NameNode發起文件讀取的請求。

2)NameNode返回文件存儲的DataNode的信息。

3)Client讀取文件信息。

2.文件寫入HDFS的基本流程詳細過程查看3.4.2節

1)Client向NameNode發起文件寫入的請求。

2)NameNode根據文件大小和文件塊配置情況,向Client返回它所管理的DataNode的信息。

3)Client將文件劃分為多個block,根據DataNode的地址信息,按順序寫入每一個DataNode中。

3.在HDFS中復制文件塊的基本流程

1)NameNode發現部分文件的block不符合最小復制數這一要求或部分DataNode失效。

2)通知DataNode相互復制block。

3)DataNode開始相互復制。

例3-3HDFS設置block的目的

減少硬盤尋道時間(Disk Seek Time)。HDFS設計的前提是支持大容量的流式數據操作,所以即使是一般的數據讀寫操作,涉及的數據量都是比較大的。假如數據塊設置過少,那需要讀取的數據塊就比較多,由于數據塊在硬盤上非連續存儲,普通硬盤因為需要移動磁頭,所以隨機尋址較慢,讀越多的數據塊就增大了總的硬盤尋道時間。當硬盤尋道時間比IO響應時間還要長得多時,那么硬盤尋道時間就成了系統的一個瓶頸。合適的塊大小有助于減少硬盤尋道時間,提高系統吞吐量。

減少NameNode內存消耗。HDFS只有一個NameNode節點,其內存相對于DataNode來說是極其有限的。然而,NameNode需要在其內存fsimage文件中記錄在DataNode中的數據塊信息,假如數據塊大小設置過小,而需要維護的數據塊信息過多,那NameNode的內存可能就不能滿足需求了。

主站蜘蛛池模板: 乐清市| 光山县| 同江市| 澄城县| 江安县| 石门县| 乌拉特后旗| 南宫市| 布尔津县| 普宁市| 丹寨县| 定结县| 织金县| 仪陇县| 西畴县| 台湾省| 静宁县| 来安县| 平湖市| 如东县| 贡觉县| 富平县| 高青县| 平顶山市| 杭锦后旗| 台山市| 澄城县| 玉山县| 弥渡县| 华蓥市| 武功县| 鸡泽县| 师宗县| 翁牛特旗| 射洪县| 龙岩市| 磐安县| 闻喜县| 白沙| 治多县| 丰镇市|