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