HDFS系列(1) | HDFS文件系統的簡單介紹

Hadoop分佈式環境搭建(簡單高效~)這篇博客中,博主在最後爲大家帶來了HDFS的初體驗。但是當時只是嘗試測試一下集羣是否有錯誤,因此,本篇博文爲大家帶來HDFS的文件系統介紹。

在介紹文件系統之前我們首先需要了解HDFS的作用。我們都知道HDFS是Hadoop的一個核心組件,那在Hadoop中HDFS扮演着怎樣的一個角色呢?我們可以通過下圖直觀的瞭解。
1

  • 上圖中個部分的作用:
  • HDFS:一個高可靠、高吞吐量的分佈式文件系統,對海量數據的存儲。
  • MapReduce:一個分佈式的資源調度和離線並行計算框架。
  • Yarn:基於HDFS,用於作業調度和集羣資源管理的框架。

話不多說,開始進入正題



一. HDFS基本介紹

HDFSHadoop Distribute File System 的簡稱,意爲:Hadoop 分佈式文件系統。是 Hadoop 核心組件之一,作爲最底層的分佈式存儲服務而存在。

分佈式文件系統解決的問題就是大數據存儲。它們是橫跨在多臺計算機上的存儲系統。分佈式文件系統在大數據時代有着廣泛的應用前景,它們爲存儲和處理超大規模數據提供所需的擴展能力。
2
可以把HDFS理解爲將多個節點上的容量彙總到一起,拼接成一個大的文件系統,在一個節點上上傳數據,在其他的節點上都能夠訪問使用。

二. HDFS的組成架構及作用

  • 1. 在HDFS中,使用主從節點的方式,即使用Master和Slave結構對集羣進行管理。一般一個 HDFS 集羣只有一個Namenode 和一定數目的Datanode 組成。Namenode 是 HDFS 集羣主節點,Datanode 是 HDFS集羣從節點,兩種角色各司其職,共同協調完成分佈式的文件存儲服務。

3
那麼如何生動的理解這一過程呢,博主準備如下圖片使大家能夠使大家能夠能加容易的理解這一概念:
4
5
6

由上圖可知:
   NameNode(Master)管理者 - 只負責管理,管理集羣內各個節點。
   SecondaryNameNode 輔助管理 – 只負責輔助NameNode管理工作。
   DataNode(Slave) 工作者,是負責工作,週期向NameNode彙報,進行讀寫數據。
  • 2. HDFS集羣包括,NameNode,DataNode,clent以及Secondary Namenode(在第九部分有圖解)

NameNode(Master)

  • 1.管理HDFS的名稱空間
  • 2.配置副本策略
  • 3.管理數據塊(Block)映射信息
  • 4.處理客戶端讀寫請求

DataNode(Slave)

  • 1.存儲實際的數據塊
  • 2.執行數據塊的讀/寫操作

Client

  • 1.文件切分。文件上傳HDFS的時候,Client將文件切分成一個一個的Block,然後進行上傳
  • 2.與NaneNode交互,獲取文件的位置信息
  • 3.與DataNode交互,讀取或者寫入數據
  • 4.Client提供一些命令來管理HDFS,比如NameNode格式化
  • 5.Client可以通過一些命令來訪問HDFS,比如對HDFS增刪查改操作

SecondaryNameNode:

  • 1.輔助NameNode,分擔其工作量,比如定期合併Fsimage和Edits,並推送給NameNode
  • 2.在緊急情況下,可輔助恢復NameNode

三. HDFS分塊存儲

HDFS將所有的文件全部抽象成爲block塊來進行存儲,不管文件大小,全部一視同仁都是以block塊的統一大小和形式進行存儲,方便我們的分佈式文件系統對文件的管理。

塊的默認大小在Hadoop2.x版本中是128M,老版本爲64M。block塊的大小可以通過hdfs-site.xml當中的配置文件進行指定。

 <property>
        <name>dfs.block.size</name>
        <value>塊大小 以字節爲單位</value>//只寫數值就可以
    </property>

7

注意:
你需要了解知識點:
一個文件100M,上傳到HDFS佔用幾個快?一個塊128M,剩餘的28M怎麼辦?
事實上,128只是個數字,數據超過128M,便進行切分,如果沒有超過128M,就不用切分,有多少算多少,不足128M的也是一個塊。這個塊的大小就是100M,沒有剩餘28M這個概念。

四. 抽象成數據塊的好處

爲什麼要要將數據抽象成數據塊呢?又有哪些好處?

  1. 一個文件有可能大於集羣中任意一個磁盤
    10T*3/128 = xxx塊 2T,2T,2T 文件方式存—–>多個block塊,這些block塊屬於一個文件
  2. 使用塊抽象而不是文件可以簡化存儲子系統
  3. 塊非常適合用於數據備份進而提供數據容錯能力和可用性

通常DataNode從磁盤中讀取塊,但對於訪問頻繁的文件,其對應的塊可能被顯示的緩存在DataNode的內存中,以堆外塊緩存的形式存在。默認情況下,一個塊僅緩存在一個DataNode的內存中,當然可以針對每個文件配置DataNode的數量。作業調度器通過在緩存塊的DataNode上運行任務,可以利用塊緩存的優勢提高讀操作的性能。

例如:
連接(join)操作中使用的一個小的查詢表就是塊緩存的一個很好的候選。
用戶或應用通過在緩存池中增加一個cache directive來告訴namenode需要緩存哪些文件及存多久。緩存池(cache pool)是一個擁有管理緩存權限和資源使用的管理性分組。
例如一個文件 130M,會被切分成2個block塊,保存在兩個block塊裏面,實際佔用磁盤130M空間,而不是佔用256M的磁盤空間

五. HDFS副本機制

HDFS視硬件錯誤爲常態,硬件服務器隨時有可能發生故障。爲了容錯,文件的所有 block 都會有副本。每個文件的 block 大小和副本系數都是可配置的。應用程序可以指定某個文件的副本數目。副本系數可以在文件創建的時候指定,也可以在之後改變。
數據副本默認保存三個副本,我們可以更改副本數以提高數據的安全性,怎樣修改副本數呢?

vim hdfs-site.xml

<property>
      <name>dfs.replication</name>
      #  這裏填寫副本數,修改完畢之後記得重啓集羣生效
      <value>3</value>
</property>

六. Hadoop2.7.2副本節點選擇

第一個副本在client所處的節點上。如果客戶端在集羣外,隨機選一個。
第二個副本和第一個副本位於相同機架,隨機節點。
第三個副本位於不同機架,隨機節點。

8

七. 名字空間(NameSpace)

HDFS 支持傳統的層次型文件組織結構。用戶或者應用程序可以創建目錄,然後將文件保存在這些目錄裏。文件系統名字空間的層次結構和大多數現有的文件系統類似:用戶可以創建、刪除、移動或重命名文件
Namenode 負責維護文件系統的名字空間,任何對文件系統名字空間或屬性的修改都將被Namenode 記錄下來。
HDFS 會給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問文件,
形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
9

八. Namenode 元數據管理

  • 1.我們把目錄結構及文件分塊位置信息叫做元數據。Namenode負責維護整個hdfs文件系統的目錄樹結構,以及每一個文件所對應的 block 塊信息(block 的id,及所在的datanode服務器)。
    10
  • 2. Namenode節點負責確定指定的文件塊到具體的Datanode結點的映射關係。在客戶端與數據節點之間共享數據。
    11
  • 3.管理Datanode結點的狀態報告,包括Datanode結點的健康狀態報告和其所在結點上數據塊狀態報告,以便能夠及時處理失效的數據結點。
    12

九. Datanode 數據存儲

  • 1. 文件的各個 block 的具體存儲管理由 datanode 節點承擔。每一個 block 都可以在多個datanode
    上。Datanode 需要定時向 Namenode 彙報自己持有的 block信息。 存儲多個副本(副本數量也可以通過參數設置
    dfs.replication,默認是 3)。
    13
  • 2.向Namenode結點報告狀態。每個Datanode結點會週期性地向Namenode發送心跳信號和文件塊狀態報告。

心跳是每3秒一次,心跳返回結果帶有namenode給該datanode的命令如複製塊數據到另一臺機器,或刪除某個數據塊。如果超過10分鐘沒有收到某個datanode的心跳,則認爲該節點不可用。
DataNode啓動後向namenode註冊,通過後,週期性(1小時)的向namenode上報所有的塊信息。
14

  • 3.執行數據的流水線複製。當文件系統客戶端從Namenode服務器進程獲取到要進行復制的數據塊列表後,完成文件塊及其塊副本的流水線複製。

一個數據塊在datanode上以文件形式存儲在磁盤上,包括兩個文件,一個是數據本身,一個是元數據包括數據塊的長度,塊數據的校驗和,以及時間戳。
15


本次的分享就到這裏了,喜歡的各位小夥伴們希望你們能夠點贊和關注呀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章