大數據 分佈式文件系統 HDFS原理詳解

​HDFS是Hadoop Distribute File System 的簡稱,也就是Hadoop的一個分佈式文件系統。

1、HDFS有什麼作用

1)高容錯:提供較高的容錯率,因為數據有備份,通過機架感知策略,namenode會盡量將數據的複本放到不同的機架上,所以小規模的宕機不影響數據的存儲。對於網絡的就近原則,先近再遠,如果有多個機架,會在多個機架建立副本。

宕機:操作系統無法從一個嚴重系統錯誤中恢復過來,或系統硬件層面出問題,以致系統長時間無響應,而不得不重新啟動計算機的現象。

2)成本低:可以使用低成本的硬件搭建一個分佈式文件系統。

3)規模大:能提供大規模的數據存儲,上TB、PB級的規模。

4)高吞吐:高吞吐的數據訪問,獲得一個完整的數據可以從多個機器上同時讀取。

5)讀取方式多樣:計算時數據讀取的方式多采用本地化方式,如果本地化方式不滿足則採用臨近網絡的方式,這也是通過機架感知策略。


2、機架感知策略的實現機制

默認情況下,Hadoop機架感知是沒有啟用的,需要在NameNode機器的hadoop-site.xml裡配置一個選項,例如:

<code><property>
    <name>topology.script.file.name/<name>
    <value>/path/to/script/<value>
/<property>/<code>

這個配置選項的value指定為一個可執行程序,通常為一個腳本,該腳本接受一個參數,輸出一個值。接受的參數通常為datanode機器的ip地址,而輸出的值通常為該ip地址對應的datanode所在的rackID,例如”/rackid1”。

Namenode啟動時,會判斷該配置選項是否為空,如果非空,則表示已經啟用機架感知的配置,此時namenode會根據配置尋找該腳本,並在接收到每一個datanode的heartbeat時,將該datanode的ip地址作為參數傳給該腳本運行,並將得到的輸出作為該datanode所屬的機架,保存到內存的一個map中。

大數據 分佈式文件系統 HDFS原理詳解

3、HDFS的系統結構

大數據 分佈式文件系統 HDFS原理詳解

namenode:管理者,管理數據塊映射;處理客戶端的讀寫請求。一般有一個active狀態的namenode,有一個standby狀態的namenode,其中,active狀態的NameNode負責所有的客戶端操作,standby狀態的NameNode處於從屬地位,維護著數據狀態,隨時準備切換。

journalnode:負責兩個狀態的namenode進行數據同步,保持數據一致。

ZKFC:作用是HA自動切換。會將NameNode的active狀態信息保存到zookeeper。

datanode:幹活的,負責存儲client發來的數據塊block;執行數據塊的讀寫操作。

namenode和datanode之間的關係:

1)datanode啟動時要在namenode上註冊,當datanode改變時,也要通知namenode。datanode 會定期向NameNode發送心跳,告知NameNode 該節點的datanode是活著的。

2)datanode之間可以相互傳輸數據。


4、數據塊——block

1)數據塊是基本的數據存儲單位,一般大小為64M/128M/256M,一個大文件根據數據塊的大小,將文件分為若干個塊。NameNode存儲的文件對應的block映射信息;而datanode存儲塊信息對應的數據。

2)塊越小讀取的速度就越快,但是整體佔用namenode的空間就越大,因為不管塊大小一個塊所佔用的namenode內存存儲空間為一般為150字節。

3)一個大文件會被拆分成一個個的塊,然後存儲於不同的機器。對於大規模的集群會存儲在不同的機架上,如果一個文件少於Block大小,那麼實際佔用的空間為其文件的大小。

4)數據塊也是基本的讀寫單位,類似於磁盤的扇區,每次都是讀寫一個塊。讀寫多個塊就合成了一個文件。

5)為了容錯,文件的所有數據塊都會有副本,也就是說複製的是數據塊而不是單獨的一個文件被複制了,默認複製3份,可以在hdft-site.xml裡進行配置。

6)副本的數據的存儲規則:

① 若client為DataNode節點,那存儲block時,規則為:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。

② 若client不為DataNode節點,那存儲block時,規則為:副本1,隨機選擇一個節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。

大數據 分佈式文件系統 HDFS原理詳解

5、 namenode

1)namenode是整個集群的中心,負責安排管理集群中數據的存儲並記錄存儲文件的元數據和負責客戶端對文件的訪問。

2)存儲文件的元數據(metadata),主要包括整個文件系統的目錄樹、文件名與blockid的映射關係、blockid在哪個datanode上。

3)在運行時把所有的元數據都保存到namenode機器的內存中,所以整個HDFS可存儲的文件數受限於namenode的內存大小。

大數據 分佈式文件系統 HDFS原理詳解

4)一個block 在namenode中對應一條記錄。

5)namenode的元數據的鏡像文件(fsimage)會保存到本地磁盤,但不保存block具體的位置信息,而是由DataNode註冊和運行時進行上報維護。

6)namenode崩潰了,那整個HDFS也就崩潰了,所以要採用冗餘的方案來保證NameNode的高可用性。

7)元數據fsimage的保存不及時,如果namenode要是宕機了怎麼辦?可以通過HDFS的操作日誌記錄文件(editlog)來恢復,如果元數據fsimage完整就直接恢復,不完整再用editlog進行補餘。


6、datanode

1)保存block塊對應的具體數據;給NameNode發送心跳;負責數據的讀寫和複製操作。

2)datanode啟動時會向namenode報告當前存儲的數據塊信息,也會持續的報告數據塊的修改信息。

3)datanode之間會進行互相通信,來完成複製數據塊的動作,以保證數據的冗餘性。


7、HDFS數據的寫入過程

大數據 分佈式文件系統 HDFS原理詳解

1)客戶端發起數據寫入請求,告訴namenode要寫入的文件信息;2)namenode根據你的情況(client端所在位置、文件大小)分配給你分配寫入數據的位置也就是寫到那幾個機器上;3)向datanode寫入數據;4)datanode複製數據;5)複製完成之後,各數據節點向namenode上報block信息;6)datanode通知客戶端已完成。


8、HDFS數據的讀取過程

大數據 分佈式文件系統 HDFS原理詳解

1)客戶端發起讀數據的請求;2)告訴namenode要讀那個文件;3)namenode返回block信息列表(包括要讀取的數據在那個機器上);4)到指定的機器上讀取具體的數據;5)datanode根據block信息找到數據的存儲位置並返回數據給客戶端;6)客戶端讀完數據之後告訴namenode我已經讀取完成。


分享到:


相關文章: