hdfs一些機制的簡介

一.HDFS的基本框架

hdfs一些機制的簡介

如上圖所示,分NameNode、SecondaryNameNode、DataNode這幾個角色。

NameNode:存放的是數據的數據即元數據,其中元數據包括fsimage(元數據鏡像文件)+edits(元數據的操作日誌);

SecondaryNameNode:是NameNode的冷備份;合併fsimage和fsedits然後再發給namenode。

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

冷備份:SecondaryNameNode是namenode的冷備份,如果namenode壞掉。那麼SecondaryNameNode不能代替SecondaryNameNode的工作,只能降低損失。

詳細的工作原理就不多介紹了,在讀寫機制都有涉及。

二.主要介紹hdfs的寫機制

hdfs一些機制的簡介

有一個文件FileA,100M大小。Client將FileA寫入到HDFS上。

HDFS按默認配置(block備份三個,每個block默認為64M)。

HDFS分佈在三個機架上Rack1,Rack2,Rack3。

a. Client將FileA按64M分塊。分成兩塊,block1和Block2;

b. Client向nameNode發送寫數據請求,如圖藍色虛線①。

c. NameNode節點,記錄block信息。並返回可用的DataNode,如粉色虛線②。

Block1: host2,host1,host3

Block2: host7,host8,host4

原理:

NameNode具有RackAware機架感知功能,這個可以配置,我們認為為默認。

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

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

d. client向DataNode發送block1;發送過程是以流式寫入。

流式寫入過程,

1>將64M的block1按64k的package劃分;

2>然後將第一個package發送給host2;

3>host2接收完後,將第一個package發送給host1,同時client想host2發送第二個package;

4>host1接收完第一個package後,發送給host3,同時接收host2發來的第二個package。

5>以此類推,如圖紅線實線所示,直到將block1發送完畢。

6>host2,host1,host3向NameNode,host2向Client發送通知,說“消息發送完了”。如圖粉紅顏色實線所示。

7>client收到host2發來的消息後,向namenode發送消息,說我寫完了。這樣就真完成了。如圖黃色粗實線

8>發送完block1後,再向host7,host8,host4發送block2,如圖藍色實線所示。

9>發送完block2後,host7,host8,host4向NameNode,host7向Client發送通知,如圖淺綠色實線所示。

10>client向NameNode發送消息,說我寫完了,如圖黃色粗實線。。。這樣就完畢了。

分析,通過寫過程,我們可以瞭解到:

①寫1T文件,我們需要3T的存儲,3T的存儲空間。

②在執行讀或寫的過程中,都會對datanode進行檢測,防止datanode掛掉或者什麼的。

③掛掉一個節點,沒關係,還有其他節點可以備份;甚至,掛掉某一個機架,也沒關係;其他機架上,也有備份,容錯機制在下面有介紹。

三.讀機制

hdfs一些機制的簡介

那麼,讀操作流程為:

a. client向namenode發送讀請求。

b. namenode查看Metadata信息,返回fileA的block的位置。

block1:host2,host1,host3

block2:host7,host8,host4

c. block的位置是有先後順序的,先讀block1,再讀block2。而且block1去host2上讀取;然後block2,去host7上讀取(原則優先讀取本機架的datanode)。

四.hdfs的容錯機制簡介

a.如果結點不工作了怎麼辦?

解決方法:(datanode不工作)client給datanode傳數據的時候每個datanode每三秒鐘向namenode發送heartbeat,namenode根據heartbeat判斷datanode的情況,如果十分鐘接收不到datanode的heartbeat,namenode就認為此datanode無效;(namenode不工作)只有啟動熱備份進行工作。

b.讀寫容錯

由於寫是根據讀寫流的方式進行的,所以如果一個datanode出錯就不能完成備份

解決方案:由於是根據流的方式(64k)寫入的,所以三個datanode每接受一個64k都要向namenode發送一個信號(告訴64k接收完畢,datanode正常工作),如果那個有異常,那麼namenode就繞過異常的datanode。

c.機架感應也能有效的容錯,由於機架感應三個namenode不可能在同一個機架上,所以即使一個機架掛掉,其他機架上還有備份,大大提高了hdfs的容錯。

五.搭hdfs的環境之後並不能馬上就能用,首先要對namenode進行格式化,格式化都操作了寫什麼?

在NameNode節點上,有兩個最重要的路徑,分別被用來存儲元數據信息和操作日誌,而這兩個路徑來自於配置文件,它們對應的屬性分別是dfs.name.dir和dfs.name.edits.dir,同時,它們默認的路徑均是/tmp/hadoop/dfs/name。格式化時,NameNode會清空兩個目錄下的所有文件,之後,會在目錄dfs.name.dir下創建文件:

  1. /current/fsimage

  2. /current/fstime

  3. /current/VERSION

  4. /image/fsimage

會在目錄dfs.name.edits.dir下創建文件:

  1. /current/edits

  2. /current/fstime

  3. /current/VERSION

  4. /image/fsimage

那麼這些文件又是用來幹什麼的呢?

fsimage:存儲命名空間(實際上就是目錄和文件)的元數據信息,文件結構如下:

edits:用來存儲對命名空間操作的日誌信息,實現NameNode節點的恢復;

fstime:用來存儲元數據上一次check point 的時間;

VERSION:用來存儲NameNode版本信息,命名空間ID(版本號)。


分享到:


相關文章: