Hadoop中HDFS的工做原理

HDFS(Hadoop Distributed File System )Hadoop分佈式文件系統。是根據google發表的論文翻版的。論文爲GFS(Google File System)Google 文件系統(中文英文)。 html

HDFS有不少特色 node

    ① 保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復。默認存3份。 網絡

    ② 運行在廉價的機器上。(商用機) 分佈式

    ③ 適合大數據的處理。多大?多小?HDFS默認會將文件分割成block,64M爲1個block。而後將block按鍵值對存儲在HDFS上,並將鍵值對的映射存到內存中。若是小文件太多,那內存的負擔會很重。 oop

如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。 佈局

NameNode:是Master節點,是大領導。管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間; 大數據

SecondaryNameNode:是一個小弟,分擔大哥namenode的工做量;是NameNode的冷備份;合併fsimage和fsedits而後再發給namenode。 google

DataNode:Slave節點,奴隸,幹活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操做。 spa

熱備份:b是a的熱備份,若是a壞掉。那麼b立刻運行代替a的工做。 3d

冷備份:b是a的冷備份,若是a壞掉。那麼b不能立刻代替a工做。可是b上存儲a的一些信息,減小a壞掉以後的損失。

fsimage:元數據鏡像文件(文件系統的目錄樹。)

edits:元數據的操做日誌(針對文件系統作的修改操做記錄)

namenode內存中存儲的是=fsimage+edits。

SecondaryNameNode負責定時默認1小時,從namenode上,獲取fsimage和edits來進行合併,而後再發送給namenode。減小namenode的工做量。因此講secondarynamenode,單獨放置到一臺機器上,能夠增大冗餘,可是有可能會丟失一小時內處理的數據。

 


 

工做原理

寫操做:

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

HDFS按默認配置。

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的網絡流量貸款。

    在執行讀或寫的過程當中,NameNode和DataNode經過HeartBeat進行保存通訊,肯定DataNode活着。若是發現DataNode死掉了,就將死掉的DataNode上的數據,放到其餘節點去。讀取時,要讀其餘節點去。

    掛掉一個節點,不要緊,還有其餘節點能夠備份;甚至,掛掉某一個機架,也不要緊;其餘機架上,也有備份。

 

讀操做:

 

讀操做就簡單一些了,如圖所示,client要從datanode上,讀取FileA。而FileA由block1和block2組成。 

 

那麼,讀操做流程爲:

a. client向namenode發送讀請求。

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

    block1:host2,host1,host3

    block2:host7,host8,host4

c. block的位置是有前後順序的,先讀block1,再讀block2。並且block1去host2上讀取;而後block2,去host7上讀取;

 

上面例子中,client位於機架外,那麼若是client位於機架內某個DataNode上,例如,client是host6。那麼讀取的時候,遵循的規律是:

優選讀取本機架上的數據

 


 

HDFS中經常使用到的命令

一、hadoop fs

hadoop fs -ls /
hadoop fs -lsr
hadoop fs -mkdir /user/hadoop
hadoop fs -put a.txt /user/hadoop/
hadoop fs -get /user/hadoop/a.txt /
hadoop fs -cp src dst
hadoop fs -mv src dst
hadoop fs -cat /user/hadoop/a.txt
hadoop fs -rm /user/hadoop/a.txt
hadoop fs -rmr /user/hadoop/a.txt
hadoop fs -text /user/hadoop/a.txt
hadoop fs -copyFromLocal localsrc dst 與hadoop fs -put功能相似。
hadoop fs -moveFromLocal localsrc dst 將本地文件上傳到hdfs,同時刪除本地文件。

二、hadoop fsadmin 

hadoop dfsadmin -report
hadoop dfsadmin -safemode enter | leave | get | wait
hadoop dfsadmin -setBalancerBandwidth 1000

三、hadoop fsck

四、start-balancer.sh

 

注意,看了hdfs的佈局,以及做用,這裏須要考慮幾個問題:

一、既然NameNode,存儲小文件不太合適,那小文件如何處理?

二、NameNode在內存中存儲了meta等信息,那麼內存的瓶頸如何解決?

三、Secondary是NameNode的冷備份,那麼SecondaryNamenode和Namenode不該該放到一臺設備上,由於Namenode宕掉以後,SecondaryNamenode通常也就死了,那講SecondaryNameNode放到其餘機器上,如何配置?

四、NameNode宕機後,如何利用secondaryNameNode上面的備份的數據,恢復Namenode?

五、設備宕機,那麼,文件的replication備份數目,就會小於配置值,那麼該怎麼辦?

相關文章
相關標籤/搜索