微信公眾號(hào): Spark大數(shù)據(jù)
1、HDFS有什么作用
HDFS是Hadoop Distribute File System 的簡稱,也就是Hadoop的一個(gè)分布式文件系統(tǒng)。
1)高容錯(cuò):提供較高的容錯(cuò)率,因?yàn)閿?shù)據(jù)有備份星立,通過機(jī)架感知策略爽茴,namenode會(huì)盡量將數(shù)據(jù)的復(fù)本放到不同的機(jī)架上,所以小規(guī)模的宕機(jī)不影響數(shù)據(jù)的存儲(chǔ)贞铣。
對(duì)于網(wǎng)絡(luò)的就近原則闹啦,先近再遠(yuǎn),如果有多個(gè)機(jī)架辕坝,會(huì)在多個(gè)機(jī)架建立副本。
宕機(jī):操作系統(tǒng)無法從一個(gè)嚴(yán)重系統(tǒng)錯(cuò)誤中恢復(fù)過來荐健,或系統(tǒng)硬件層面出問題酱畅,以致系統(tǒng)長時(shí)間無響應(yīng),而不得不重新啟動(dòng)計(jì)算機(jī)的現(xiàn)象江场。
2)成本低:可以使用低成本的硬件搭建一個(gè)分布式文件系統(tǒng)纺酸。
3)規(guī)模大:能提供大規(guī)模的數(shù)據(jù)存儲(chǔ),上TB址否、PB級(jí)的規(guī)模餐蔬。
4)高吞吐:高吞吐的數(shù)據(jù)訪問,獲得一個(gè)完整的數(shù)據(jù)可以從多個(gè)機(jī)器上同時(shí)讀取佑附。
5)讀取方式多樣:計(jì)算時(shí)數(shù)據(jù)讀取的方式多采用本地化方式樊诺,如果本地化方式不滿足則采用臨近網(wǎng)絡(luò)的方式,這也是通過機(jī)架感知策略音同。
2词爬、機(jī)架感知策略的實(shí)現(xiàn)機(jī)制
默認(rèn)情況下,Hadoop機(jī)架感知是沒有啟用的权均,需要在NameNode機(jī)器的hadoop-site.xml里配置一個(gè)選項(xiàng)顿膨,例如:
<property>
<name>topology.script.file.name</name>
<value>/path/to/script</value>
</property>
這個(gè)配置選項(xiàng)的value指定為一個(gè)可執(zhí)行程序,通常為一個(gè)腳本叽赊,該腳本接受一個(gè)參數(shù)恋沃,輸出一個(gè)值。接受的參數(shù)通常為datanode機(jī)器的ip地址必指,而輸出的值通常為該ip地址對(duì)應(yīng)的datanode所在的rackID囊咏,例如”/rackid1”。
Namenode啟動(dòng)時(shí)取劫,會(huì)判斷該配置選項(xiàng)是否為空匆笤,如果非空,則表示已經(jīng)啟用機(jī)架感知的配置谱邪,此時(shí)namenode會(huì)根據(jù)配置尋找該腳本炮捧,并在接收到每一個(gè)datanode的heartbeat時(shí),將該datanode的ip地址作為參數(shù)傳給該腳本運(yùn)行惦银,并將得到的輸出作為該datanode所屬的機(jī)架咆课,保存到內(nèi)存的一個(gè)map中末誓。3、HDFS的系統(tǒng)結(jié)構(gòu)
namenode:大領(lǐng)導(dǎo)书蚪,管理數(shù)據(jù)塊映射喇澡;處理客戶端的讀寫請(qǐng)求。一般有一個(gè)active狀態(tài)的namenode殊校,有一個(gè)standby狀態(tài)的namenode晴玖,其中,active狀態(tài)的NameNode負(fù)責(zé)所有的客戶端操作为流,standby狀態(tài)的NameNode處于從屬地位呕屎,維護(hù)著數(shù)據(jù)狀態(tài),隨時(shí)準(zhǔn)備切換敬察。
journalnode:負(fù)責(zé)兩個(gè)狀態(tài)的namenode進(jìn)行數(shù)據(jù)同步秀睛,保持?jǐn)?shù)據(jù)一致。
ZKFC:作用是HA自動(dòng)切換莲祸。會(huì)將NameNode的active狀態(tài)信息保存到zookeeper蹂安。
datanode:干活的,負(fù)責(zé)存儲(chǔ)client發(fā)來的數(shù)據(jù)塊block锐帜;執(zhí)行數(shù)據(jù)塊的讀寫操作田盈。
namenode和datanode之間的關(guān)系:
1)datanode啟動(dòng)時(shí)要在namenode上注冊(cè),當(dāng)datanode改變時(shí)抹估,也要通知namenode缠黍。datanode 會(huì)定期向NameNode發(fā)送心跳,告知NameNode 該節(jié)點(diǎn)的datanode是活著的药蜻。
2)datanode之間可以相互傳輸數(shù)據(jù)瓷式。
4、數(shù)據(jù)塊——block
1)數(shù)據(jù)塊是基本的數(shù)據(jù)存儲(chǔ)單位语泽,一般大小為64M/128M/256M贸典,一個(gè)大文件根據(jù)數(shù)據(jù)塊的大小,將文件分為若干個(gè)塊踱卵。NameNode存儲(chǔ)的文件對(duì)應(yīng)的block映射信息廊驼;而datanode存儲(chǔ)塊信息對(duì)應(yīng)的數(shù)據(jù)。
2)塊越小讀取的速度就越快惋砂,但是整體占用namenode的空間就越大妒挎,因?yàn)椴还軌K大小一個(gè)塊所占用的namenode內(nèi)存存儲(chǔ)空間為一般為150字節(jié)。
3)一個(gè)大文件會(huì)被拆分成一個(gè)個(gè)的塊西饵,然后存儲(chǔ)于不同的機(jī)器酝掩。對(duì)于大規(guī)模的集群會(huì)存儲(chǔ)在不同的機(jī)架上,如果一個(gè)文件少于Block大小眷柔,那么實(shí)際占用的空間為其文件的大小期虾。
4)數(shù)據(jù)塊也是基本的讀寫單位原朝,類似于磁盤的扇區(qū),每次都是讀寫一個(gè)塊镶苞。讀寫多個(gè)塊就合成了一個(gè)文件喳坠。
5)為了容錯(cuò),文件的所有數(shù)據(jù)塊都會(huì)有副本茂蚓,也就是說復(fù)制的是數(shù)據(jù)塊而不是單獨(dú)的一個(gè)文件被復(fù)制了壕鹉,默認(rèn)復(fù)制3份,可以在hdft-site.xml里進(jìn)行配置聋涨。
6)副本的數(shù)據(jù)的存儲(chǔ)規(guī)則:
① 若client為DataNode節(jié)點(diǎn)御板,那存儲(chǔ)block時(shí),規(guī)則為:副本1牛郑,同client的節(jié)點(diǎn)上;副本2敬鬓,不同機(jī)架節(jié)點(diǎn)上淹朋;副本3,同第二個(gè)副本機(jī)架的另一個(gè)節(jié)點(diǎn)上钉答;其他副本隨機(jī)挑選础芍。
② 若client不為DataNode節(jié)點(diǎn),那存儲(chǔ)block時(shí)数尿,規(guī)則為:副本1仑性,隨機(jī)選擇一個(gè)節(jié)點(diǎn)上;副本2右蹦,不同機(jī)架節(jié)點(diǎn)上诊杆;副本3,同第二個(gè)副本機(jī)架的另一個(gè)節(jié)點(diǎn)上何陆;其他副本隨機(jī)挑選晨汹。
5、 namenode
1)namenode是整個(gè)集群的中心贷盲,負(fù)責(zé)安排管理集群中數(shù)據(jù)的存儲(chǔ)并記錄存儲(chǔ)文件的元數(shù)據(jù)和負(fù)責(zé)客戶端對(duì)文件的訪問淘这。
2)存儲(chǔ)文件的元數(shù)據(jù)(metadata),主要包括整個(gè)文件系統(tǒng)的目錄樹巩剖、文件名與blockid的映射關(guān)系铝穷、blockid在哪個(gè)datanode上。
3)在運(yùn)行時(shí)把所有的元數(shù)據(jù)都保存到namenode機(jī)器的內(nèi)存中佳魔,所以整個(gè)HDFS可存儲(chǔ)的文件數(shù)受限于namenode的內(nèi)存大小曙聂。
4)一個(gè)block 在namenode中對(duì)應(yīng)一條記錄。
5)namenode的元數(shù)據(jù)的鏡像文件(fsimage)會(huì)保存到本地磁盤吃引,但不保存block具體的位置信息筹陵,而是由DataNode注冊(cè)和運(yùn)行時(shí)進(jìn)行上報(bào)維護(hù)刽锤。
6)namenode崩潰了,那整個(gè)HDFS也就崩潰了朦佩,所以要采用冗余的方案來保證NameNode的高可用性并思。
7)元數(shù)據(jù)fsimage的保存不及時(shí),如果namenode要是宕機(jī)了怎么辦语稠?
可以通過HDFS的操作日志記錄文件(editlog)來恢復(fù)宋彼,如果元數(shù)據(jù)fsimage完整就直接恢復(fù),不完整再用editlog進(jìn)行補(bǔ)余仙畦。
6输涕、datanode
1)保存block塊對(duì)應(yīng)的具體數(shù)據(jù);給NameNode發(fā)送心跳慨畸;負(fù)責(zé)數(shù)據(jù)的讀寫和復(fù)制操作莱坎。
2)datanode啟動(dòng)時(shí)會(huì)向namenode報(bào)告當(dāng)前存儲(chǔ)的數(shù)據(jù)塊信息,也會(huì)持續(xù)的報(bào)告數(shù)據(jù)塊的修改信息寸士。
3)datanode之間會(huì)進(jìn)行互相通信檐什,來完成復(fù)制數(shù)據(jù)塊的動(dòng)作,以保證數(shù)據(jù)的冗余性弱卡。
7乃正、HDFS數(shù)據(jù)的寫入過程
1)客戶端發(fā)起數(shù)據(jù)寫入請(qǐng)求,告訴namenode要寫入的文件信息婶博;
2)namenode根據(jù)你的情況(client端所在位置瓮具、文件大小)分配給你分配寫入數(shù)據(jù)的位置也就是寫到那幾個(gè)機(jī)器上凡人;
3)向datanode寫入數(shù)據(jù)名党;
4)datanode復(fù)制數(shù)據(jù);
5)復(fù)制完成之后划栓,各數(shù)據(jù)節(jié)點(diǎn)向namenode上報(bào)block信息兑巾;
6)datanode通知客戶端已完成;
8忠荞、HDFS數(shù)據(jù)的讀取過程
1)客戶端發(fā)起讀數(shù)據(jù)的請(qǐng)求蒋歌;
2)告訴namenode要讀那個(gè)文件;
3)namenode返回block信息列表(包括要讀取的數(shù)據(jù)在那個(gè)機(jī)器上)委煤;
4)到指定的機(jī)器上讀取具體的數(shù)據(jù)堂油;
5)datanode根據(jù)block信息找到數(shù)據(jù)的存儲(chǔ)位置并返回?cái)?shù)據(jù)給客戶端;
6)客戶端讀完數(shù)據(jù)之后告訴namenode我已經(jīng)讀取完成碧绞;
關(guān)注微信公眾號(hào):Spark大數(shù)據(jù) 或許更多內(nèi)容