隨著我們網(wǎng)絡(luò)的發(fā)達(dá),科技的發(fā)達(dá),我們網(wǎng)絡(luò)上產(chǎn)生的數(shù)據(jù)越來(lái)越多,越來(lái)越大,那么大到什么地步,有10000G那么大嗎?告訴你比那個(gè)大多了!那有1000T那么大嗎?比那個(gè)也大多了,已經(jīng)是單一的服務(wù)器解決不了的,那么我們不是可以多用幾臺(tái)服務(wù)器就解決了?一臺(tái)一臺(tái)服務(wù)器分別寫(xiě)入和讀取數(shù)據(jù)是很麻煩的。
接著分布式文件系統(tǒng)就應(yīng)運(yùn)而生了,它可以管轄很多服務(wù)器用來(lái)存儲(chǔ)數(shù)據(jù),通過(guò)這個(gè)文件系統(tǒng)存儲(chǔ)數(shù)據(jù)時(shí),我們就感覺(jué)在操作一臺(tái)服務(wù)器一樣。分布式文件系統(tǒng)管理的是一個(gè)服務(wù)器集群。在這個(gè)集群中,數(shù)據(jù)存儲(chǔ)在集群的節(jié)點(diǎn)(即集群中的服務(wù)器)中,但是該文件系統(tǒng)把服務(wù)器的差異給屏蔽了,但是數(shù)據(jù)分布在不同的服務(wù)器中,分布在不同節(jié)點(diǎn)上的數(shù)據(jù)可能是屬于同一個(gè)文件,為了組織眾多的文件,把文件放到不同的文件夾中,文件夾可以一級(jí)一級(jí)的包含。這種組織形式稱(chēng)為命名空間(namespace)。命名空間管理著集群中的所有文件。命名空間的職責(zé)和正真存儲(chǔ)真實(shí)數(shù)據(jù)的職責(zé)是不一樣的。負(fù)責(zé)命名空間職責(zé)的節(jié)點(diǎn)稱(chēng)為主節(jié)點(diǎn)(master node),負(fù)責(zé)存儲(chǔ)真實(shí)數(shù)據(jù)的職責(zé)的單稱(chēng)為從節(jié)點(diǎn)(slave node)。主節(jié)點(diǎn)負(fù)責(zé)管理文件系統(tǒng)的文件結(jié)構(gòu),從節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)真實(shí)的數(shù)據(jù),我們把這樣的結(jié)構(gòu)稱(chēng)為主從式結(jié)構(gòu)(master-slave)。用戶(hù)操作時(shí)也應(yīng)該先和主節(jié)點(diǎn)打交道,查詢(xún)數(shù)據(jù)在哪些從節(jié)點(diǎn)上存儲(chǔ),然后才從從節(jié)點(diǎn)存儲(chǔ),然后再?gòu)膹墓?jié)點(diǎn)讀取。在主節(jié)點(diǎn)中,為了加快用戶(hù)的訪(fǎng)問(wèn)速度,會(huì)把整個(gè)命名空間信息都放在內(nèi)存中,當(dāng)存儲(chǔ)的文件越多時(shí),那么主節(jié)點(diǎn)就需要越多的內(nèi)存空間。在從節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)時(shí),有的原始數(shù)據(jù)可能很大,有的可能很小,如果大小不一樣的文件不容易管理,那么抽象出一個(gè)獨(dú)立的存儲(chǔ)文件單位,稱(chēng)為:塊(block)。然后數(shù)據(jù)存放在集群中,可能網(wǎng)絡(luò)原因或者服務(wù)器硬件原因造成訪(fǎng)問(wèn)失敗,所以又才用了副本機(jī)制(replication),把數(shù)據(jù)同時(shí)備份到多臺(tái)服務(wù)器中,這樣數(shù)據(jù)就更安全了。
在hadoop中,分布式存儲(chǔ)系統(tǒng)統(tǒng)稱(chēng)為HDFS(hadoop distributed file system)。其中,主節(jié)點(diǎn)為名字節(jié)點(diǎn)(namenode),從節(jié)點(diǎn)稱(chēng)為數(shù)據(jù)節(jié)點(diǎn)(datanode)。
對(duì)數(shù)據(jù)進(jìn)行處理時(shí),我們會(huì)把數(shù)據(jù)讀取到內(nèi)存中進(jìn)行處理。如果我們對(duì)海量數(shù)據(jù)讀取到內(nèi)存中進(jìn)行處理,比如數(shù)據(jù)大小是100GB,我們要統(tǒng)計(jì)文件中一共有多少個(gè)單詞。要想到文件加載到內(nèi)存中幾乎是不可能的,要想把數(shù)據(jù)加載到內(nèi)存中幾乎也是不可能的。隨著技術(shù)發(fā)展,即使服務(wù)器有100GB內(nèi)存,這樣的服務(wù)器也很昂貴,即使數(shù)據(jù)能夠加載到內(nèi)容,那么加載100GB也是需要很長(zhǎng)時(shí)間的。那么這就是我們遇到的問(wèn)題,那么我們?cè)趺刺幚砟兀?/span>
是否可以把程序代碼放到存放數(shù)據(jù)的服務(wù)器上呢?因?yàn)槌绦虼a相對(duì)于原始數(shù)據(jù)來(lái)說(shuō)很小,幾乎是可以忽略不計(jì)的,所以省下了原始數(shù)據(jù)的傳輸?shù)臅r(shí)間?,F(xiàn)在數(shù)據(jù)是存放在分布式的文件系統(tǒng)中,100GB的數(shù)據(jù)可能存放在很多服務(wù)器上,那么就可以把代碼分發(fā)到這些服務(wù)器上,在這些服務(wù)器上同時(shí)進(jìn)行,也就是并行計(jì)算,這樣就大大縮短了程序執(zhí)行的時(shí)間。分布式計(jì)算需要的是最終的結(jié)果,程序代碼在很多服務(wù)器上執(zhí)行后會(huì)產(chǎn)生很多的結(jié)果,因此需要一段代碼對(duì)這些中間結(jié)果進(jìn)行匯總。Hadoop中的分布式計(jì)算一般分為兩個(gè)階段完成的,第一階段負(fù)責(zé)讀取各數(shù)據(jù)節(jié)點(diǎn)中的原始數(shù)據(jù),進(jìn)行初步處理,對(duì)各個(gè)節(jié)點(diǎn)的數(shù)據(jù)求單詞書(shū)。然后把處理結(jié)果傳輸?shù)降诙A段,對(duì)中間結(jié)果進(jìn)行匯總,產(chǎn)生最終的結(jié)果。
在分布式計(jì)算中,程序代碼應(yīng)該允許放在哪些數(shù)據(jù)節(jié)點(diǎn)上,哪些節(jié)點(diǎn)運(yùn)行第一階段的代碼,哪些節(jié)點(diǎn)運(yùn)行第二階段的代碼;第一階段代碼執(zhí)行完畢后,傳輸?shù)降诙A段代碼所在節(jié)點(diǎn);如果中間執(zhí)行失敗了,怎么辦?等等問(wèn)題,都需要管理。運(yùn)行這些管理職責(zé)代碼的節(jié)點(diǎn)稱(chēng)為主節(jié)點(diǎn)(master node),運(yùn)行第一二階段程序代碼的節(jié)點(diǎn)稱(chēng)為從節(jié)點(diǎn)(slave node)。用戶(hù)的代碼應(yīng)該提交給主節(jié)點(diǎn),由主節(jié)點(diǎn)負(fù)責(zé)把代碼分配到不同的節(jié)點(diǎn)執(zhí)行。
在hadoop中,分布式計(jì)算部分稱(chēng)為Mapreduce。其中,主節(jié)點(diǎn)稱(chēng)為作業(yè)節(jié)點(diǎn)(jobtracker)
,從節(jié)點(diǎn)稱(chēng)為從節(jié)點(diǎn)(tasktracker)。在任務(wù)節(jié)點(diǎn)中,運(yùn)行第一段的代碼稱(chēng)為map任務(wù),運(yùn)行第二段代碼稱(chēng)為reduce任務(wù)。(看吳老師筆記寫(xiě)的)
聯(lián)系客服