簡介
HDFS(Hadoop Distributed File System )Hadoop分布式文件系統(tǒng)列肢。是根據(jù)google發(fā)表的論文翻版的载庭。論文為GFS(Google File System)Google 文件系統(tǒng)(中文苇本,英文)遵蚜。
HDFS有很多特點:
**① **保存多個副本憾赁,且提供容錯機(jī)制俯渤,副本丟失或宕機(jī)自動恢復(fù)。默認(rèn)存3份乳规。
**② **運(yùn)行在廉價的機(jī)器上员淫。
**③ **適合大數(shù)據(jù)的處理序矩。多大蜈抓?多衅舸隆昂儒?HDFS默認(rèn)會將文件分割成block沟使,64M為1個block。然后將block按鍵值對存儲在HDFS上渊跋,并將鍵值對的映射存到內(nèi)存中腊嗡。如果小文件太多着倾,那內(nèi)存的負(fù)擔(dān)會很重。

如上圖所示燕少,HDFS也是按照Master和Slave的結(jié)構(gòu)卡者。分NameNode、SecondaryNameNode客们、DataNode這幾個角色崇决。
NameNode:是Master節(jié)點,是大領(lǐng)導(dǎo)底挫。管理數(shù)據(jù)塊映射恒傻;處理客戶端的讀寫請求;配置副本策略建邓;管理HDFS的名稱空間盈厘;
SecondaryNameNode:是一個小弟,分擔(dān)大哥namenode的工作量官边;是NameNode的冷備份沸手;合并fsimage和fsedits然后再發(fā)給namenode。
DataNode:Slave節(jié)點注簿,奴隸契吉,干活的。負(fù)責(zé)存儲client發(fā)來的數(shù)據(jù)塊block诡渴;執(zhí)行數(shù)據(jù)塊的讀寫操作栅隐。
熱備份:b是a的熱備份,如果a壞掉玩徊。那么b馬上運(yùn)行代替a的工作租悄。
冷備份:b是a的冷備份,如果a壞掉恩袱。那么b不能馬上代替a工作泣棋。但是b上存儲a的一些信息,減少a壞掉之后的損失畔塔。
fsimage:元數(shù)據(jù)鏡像文件(文件系統(tǒng)的目錄樹潭辈。)
edits:元數(shù)據(jù)的操作日志(針對文件系統(tǒng)做的修改操作記錄)
namenode內(nèi)存中存儲的是=fsimage+edits。
SecondaryNameNode負(fù)責(zé)定時默認(rèn)1小時澈吨,從namenode上把敢,獲取fsimage和edits來進(jìn)行合并,然后再發(fā)送給namenode谅辣。減少namenode的工作量修赞。
工作原理
寫操作:

有一個文件FileA,100M大小桑阶。Client將FileA寫入到HDFS上柏副。
HDFS按默認(rèn)配置勾邦。
HDFS分布在三個機(jī)架上Rack1,Rack2割择,Rack3眷篇。
a. Client將FileA按64M分塊。分成兩塊荔泳,block1和Block2;
b. Client向nameNode發(fā)送寫數(shù)據(jù)請求蕉饼,如圖藍(lán)色虛線①------>。
c. NameNode節(jié)點玛歌,記錄block信息椎椰。并返回可用的DataNode,如粉色虛線②--------->沾鳄。
Block1: host2,host1,host3
Block2: host7,host8,host4
原理:
NameNode具有RackAware機(jī)架感知功能慨飘,這個可以配置。
若client為DataNode節(jié)點译荞,那存儲block時瓤的,規(guī)則為:副本1,同client的節(jié)點上吞歼;副本2圈膏,不同機(jī)架節(jié)點上;副本3篙骡,同第二個副本機(jī)架的另一個節(jié)點上稽坤;其他副本隨機(jī)挑選。
若client不為DataNode節(jié)點糯俗,那存儲block時尿褪,規(guī)則為:副本1,隨機(jī)選擇一個節(jié)點上得湘;副本2杖玲,不同副本1,機(jī)架上淘正;副本3摆马,同副本2相同的另一個節(jié)點上;其他副本隨機(jī)挑選鸿吆。
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交掏,如圖藍(lán)色實線所示妆偏。
9>發(fā)送完block2后,host7,host8,host4向NameNode盅弛,host7向Client發(fā)送通知钱骂,如圖淺綠色實線所示。
10>client向NameNode發(fā)送消息挪鹏,說我寫完了见秽,如圖黃色粗實線。讨盒。张吉。這樣就完畢了。
分析催植,通過寫過程肮蛹,我們可以了解到:
①寫1T文件,我們需要3T的存儲创南,3T的網(wǎng)絡(luò)流量貸款伦忠。
②在執(zhí)行讀或?qū)懙倪^程中,NameNode和DataNode通過HeartBeat進(jìn)行保存通信稿辙,確定DataNode活著昆码。如果發(fā)現(xiàn)DataNode死掉了,就將死掉的DataNode上的數(shù)據(jù),放到其他節(jié)點去赋咽。讀取時旧噪,要讀其他節(jié)點去。
③掛掉一個節(jié)點脓匿,沒關(guān)系淘钟,還有其他節(jié)點可以備份;甚至陪毡,掛掉某一個機(jī)架米母,也沒關(guān)系;其他機(jī)架上毡琉,也有備份铁瞒。
讀操作:

讀操作就簡單一些了,如圖所示桅滋,client要從datanode上慧耍,讀取FileA。而FileA由block1和block2組成丐谋。
那么芍碧,讀操作流程為:
a. client向namenode發(fā)送讀請求。
b. namenode查看Metadata信息笋鄙,返回fileA的block的位置师枣。
block1:host2,host1,host3
block2:host7,host8,host4
c. block的位置是有先后順序的,先讀block1萧落,再讀block2践美。而且block1去host2上讀取找岖;然后block2陨倡,去host7上讀取许布;
上面例子中兴革,client位于機(jī)架外,那么如果client位于機(jī)架內(nèi)某個DataNode上蜜唾,例如,client是host6杂曲。那么讀取的時候,遵循的規(guī)律是:
優(yōu)選讀取本機(jī)架上的數(shù)據(jù)袁余。
HDFS中常用到的命令
1擎勘、hadoop fs
+ View Code
2、hadoop fsadmin
+ View Code
3颖榜、hadoop fsck
4棚饵、start-balancer.sh