HDFS(Hadoop Distributed File System )Hadoop分布式文件系統(tǒng)。是根據google發(fā)表的論文翻版的。論文為GFS(Google File System)Google 文件系統(tǒng)。
HDFS有很多特點:
① 保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復。默認存3份。
② 運行在廉價的機器上。(商用機)
?、?適合大數據的處理。多大?多小?HDFS默認會將文件分割成block,64M為1個block。然后將block按鍵值對存儲在HDFS上,并將鍵值對的映射存到內存中。如果小文件太多,那內存的負擔會很重。

如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。
NameNode :是Master節(jié)點,是大領導。管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;
SecondaryNameNode :是一個小弟,分擔大哥namenode的工作量;是NameNode的冷備份;合并fsimage和fsedits然后再發(fā)給namenode。
DataNode :Slave 節(jié)點,奴隸,干活的。負責存儲client發(fā)來的數據塊block;執(zhí)行數據塊的讀寫操作。
熱備份 :b是a的熱備份,如果a壞掉。那么b馬上運行代替a的工作。
冷備份 :b是a的冷備份,如果a壞掉。那么b不能馬上代替a工作。但是b上存儲a的一些信息,減少a壞掉之后的損失。
fsimage :元數據鏡像文件(文件系統(tǒng)的目錄樹。)
edits :元數據的操作日志(針對文件系統(tǒng)做的修改操作記錄)
namenode內存中存儲的是=fsimage+edits。
SecondaryNameNode負責定時默認1小時,從namenode上,獲取fsimage和edits來進行合并,然后再發(fā)送給namenode。減少namenode的工作量。所以講secondarynamenode,單獨放置到一臺機器上,可以增大冗余,但是有可能會丟失一小時內處理的數據。
工作原理
寫操作:

有一個文件FileA,100M大小。Client將FileA寫入到HDFS上。
HDFS按默認配置。
HDFS分布在三個機架上Rack1,Rack2,Rack3。
a.Client將FileA按64M分塊。分成兩塊,block1和Block2;
b.Client向nameNode發(fā)送寫數據請求,如圖 藍色虛線 ① ——> 。
c.NameNode節(jié)點,記錄block信息。并返回可用的DataNode,如 粉色虛線 ②———> 。
Block1: host2,host1,host3
Block2: host7,host8,host4
原理:
NameNode具有RackAware機架感知功能,這個可以配置。
若client為DataNode節(jié)點,那存儲block時,規(guī)則為:副本1,同client的節(jié)點上;副本2,不同機架節(jié)點上;副本3,同第二個副本機架的另一個節(jié)點上;其他副本隨機挑選。
若client不為DataNode節(jié)點,那存儲block時,規(guī)則為:副本1,隨機選擇一個節(jié)點上;副本2,不同副本1,機架上;副本3,同副本2相同的另一個節(jié)點上;其他副本隨機挑選。
d.client向DataNode發(fā)送block1;發(fā)送過程是以流式寫入。
流式寫入過程,
1> 將64M的block1按64k的package劃分;
2> 然后將第一個package發(fā)送給host2;
3> host2接收完后,將第一個package發(fā)送給host1,同時client想host2發(fā)送第二個package;
4> host1接收完第一個package后,發(fā)送給host3,同時接收host2發(fā)來的第二個package。
5> 以此類推,如圖 紅線實線 所示,直到將block1發(fā)送完畢。
6> host2,host1,host3向NameNode,host2向Client發(fā)送通知,說“消息發(fā)送完了”。如圖 粉紅顏色 實線所示。
7> client收到host2發(fā)來的消息后,向namenode發(fā)送消息,說我寫完了。這樣就真完成了。如圖 黃色粗實線
8> 發(fā)送完block1后,再向host7,host8,host4發(fā)送block2,如圖 藍色實線 所示。
9> 發(fā)送完block2后,host7,host8,host4向NameNode,host7向Client發(fā)送通知,如圖淺綠色實線 所示。
10> client向NameNode發(fā)送消息,說我寫完了,如圖 黃色粗實線 。。。這樣就完畢了。
分析,通過寫過程,我們可以了解到:
?、?寫1T文件,我們需要3T的存儲,3T的網絡流量貸款。
?、?在執(zhí)行讀或寫的過程中,NameNode和DataNode通過HeartBeat進行保存通信,確定DataNode活著。如果發(fā)現DataNode死掉了,就將死掉的DataNode上的數據,放到其他節(jié)點去。讀取時,要讀其他節(jié)點去。