我們都知道現(xiàn)在大數(shù)據(jù)存儲(chǔ)用的基本都是 Hadoop Hdfs ,但在 Hadoop 誕生之前,我們都是如何存儲(chǔ)大量數(shù)據(jù)的呢?這次我們不聊技術(shù)架構(gòu)什么的,而是從技術(shù)演化的角度來(lái)看看 Hadoop Hdfs。
我們先來(lái)思考兩個(gè)問(wèn)題。
●在 Hdfs 出現(xiàn)以前,計(jì)算機(jī)是通過(guò)什么手段來(lái)存儲(chǔ)“大數(shù)據(jù)” 的呢?
●為什么會(huì)有 Hadoop Hdfs 出現(xiàn)呢?
在 Hadoop Hdfs 出現(xiàn)以前,計(jì)算機(jī)是通過(guò)什么手段來(lái)存儲(chǔ)“大數(shù)據(jù)”
要知道,存儲(chǔ)大量數(shù)據(jù)有三個(gè)最重要的指標(biāo),那就是速度,容量,容錯(cuò)性。速度和容量的重要性毋庸置疑,如果容量不夠大,或者讀取的速度不夠快,那么海量數(shù)據(jù)存儲(chǔ)也就無(wú)從談起了。而磁盤又是計(jì)算機(jī)中很容易損壞的零件,當(dāng)磁盤損壞的時(shí)候怎么辦?放任數(shù)據(jù)的丟失嗎,那可不行,這就有了容錯(cuò)性的需求。
在沒(méi)有分布式存儲(chǔ)的時(shí)代,單個(gè)磁盤容量不夠怎么辦?加磁盤唄。磁盤容易壞怎么辦,同時(shí)用其他磁盤備份唄。就這樣,獨(dú)立磁盤冗余陣列( Redundant Array of Independent Disks ),簡(jiǎn)稱 RAID,誕生了。
在 Hadoop Hdfs 出現(xiàn)以前,計(jì)算機(jī)是通過(guò)什么手段來(lái)存儲(chǔ)“大數(shù)據(jù)”
要知道,存儲(chǔ)大量數(shù)據(jù)有三個(gè)最重要的指標(biāo),那就是速度,容量,容錯(cuò)性。速度和容量的重要性毋庸置疑,如果容量不夠大,或者讀取的速度不夠快,那么海量數(shù)據(jù)存儲(chǔ)也就無(wú)從談起了。而磁盤又是計(jì)算機(jī)中很容易損壞的零件,當(dāng)磁盤損壞的時(shí)候怎么辦?放任數(shù)據(jù)的丟失嗎,那可不行,這就有了容錯(cuò)性的需求。
在沒(méi)有分布式存儲(chǔ)的時(shí)代,單個(gè)磁盤容量不夠怎么辦?加磁盤唄。磁盤容易壞怎么辦,同時(shí)用其他磁盤備份唄。就這樣,獨(dú)立磁盤冗余陣列( Redundant Array of Independent Disks ),簡(jiǎn)稱 RAID,誕生了。
在 2000 年以前,磁盤還是很珍貴的資源,不像現(xiàn)在,磁盤是 PC 機(jī)中最廉價(jià)的部件。一開始 RAID 技術(shù)是為了將多個(gè)廉價(jià)的容量較小的磁盤組合起來(lái)充當(dāng)一個(gè)大磁盤以節(jié)約成本,但后來(lái)人們發(fā)現(xiàn)這項(xiàng)技術(shù)也可以用在單臺(tái)機(jī)器磁盤擴(kuò)容上了,于是 RAID 技術(shù)開始被廣泛使用。
RAID 技術(shù)將多個(gè)磁盤組合成一個(gè)邏輯扇區(qū),對(duì)計(jì)算機(jī)而言,它會(huì)將 RAID 當(dāng)作一個(gè)磁盤來(lái)處理。使用 RAID 的好處有:增強(qiáng)數(shù)據(jù)集成度,增強(qiáng)容錯(cuò)功能,增加處理量或容量。
另外 RAID 也有分為多個(gè)檔次,標(biāo)準(zhǔn)的分法,分別是 RAID0 , RAID1 , RAID2 ,RAID3 ,RAID4 ,RAID5 , RAID6 ,每個(gè)檔次都有對(duì)應(yīng)的優(yōu)缺點(diǎn)。這里就不詳細(xì)介紹,這些 RAID 等級(jí)的不同主要是對(duì) 上述說(shuō)到的三個(gè)數(shù)據(jù)存儲(chǔ)要素(速度,容量,容錯(cuò)性)的不同取舍,各有各的應(yīng)用場(chǎng)景。我們從上述的三個(gè)指標(biāo)來(lái)看 RAID 技術(shù)。
●速度: RAID通過(guò)在多個(gè)磁盤上同時(shí)存儲(chǔ)和讀取數(shù)據(jù)來(lái)大幅提高存儲(chǔ)系統(tǒng)的數(shù)據(jù)吞吐量。在RAID中,可以讓很多磁盤驅(qū)動(dòng)器同時(shí)傳輸數(shù)據(jù),而這些磁盤驅(qū)動(dòng)器在邏輯上又是一個(gè)磁盤驅(qū)動(dòng)器,所以使用RAID可以達(dá)到單個(gè)磁盤驅(qū)動(dòng)器幾倍、幾十倍甚至上百倍的速率。
●容量: 可以將多個(gè)磁盤連接起來(lái),對(duì)比以前的單個(gè)磁盤存儲(chǔ),RAID 將存儲(chǔ)的量級(jí)拔高了一個(gè)臺(tái)階。但依舊有其局限性,因?yàn)?RAID 始終是放在單臺(tái)機(jī)器上,機(jī)器的磁盤卡槽不可能無(wú)限增加,磁盤也不可能一直增大。
●容錯(cuò)性: 不同等級(jí)的 RAID 使用不同的數(shù)據(jù)冗余策略,保證數(shù)據(jù)的容錯(cuò)性。比如最簡(jiǎn)單的 RAID1 就是數(shù)據(jù)在寫入磁盤時(shí),將一份數(shù)據(jù)同時(shí)寫入兩塊磁盤,這樣任何一塊磁盤損壞都不會(huì)導(dǎo)致數(shù)據(jù)丟失,而插入一塊新磁盤就可以通過(guò)復(fù)制數(shù)據(jù)的方式自動(dòng)修復(fù),具有極高的可靠性。
為什么會(huì)有 Hadoop Hdfs 出現(xiàn)
最直接是原因是 Google 三篇大數(shù)據(jù)論文的發(fā)表,這直接導(dǎo)致了 Hadoop 的問(wèn)世。
但更深層的原因其實(shí)還是因?yàn)閭鹘y(tǒng)的但節(jié)點(diǎn)磁盤容量達(dá)到了極限,即便是用上述的 RAID 技術(shù),但單個(gè)臺(tái)服務(wù)器的容量始終有一個(gè)邊界值。而且隨著互聯(lián)網(wǎng)的普及,在 2000 年后,數(shù)據(jù)的積累呈指數(shù)式增長(zhǎng),這時(shí)候單臺(tái)服務(wù)器顯然已經(jīng)放不下這海量的數(shù)據(jù)了。但是就像 RAID 的改革思想一樣,既然單臺(tái)服務(wù)器不夠,那我們就加服務(wù)器唄。
最早是 Google ,他們?cè)谧约旱南到y(tǒng)上實(shí)現(xiàn)了 Google File System(GFS) 這么一個(gè)分布式存儲(chǔ)系統(tǒng),并在 03 年的時(shí)候?qū)⑺膶?shí)現(xiàn)論文發(fā)表了出來(lái)。而后 Doug Cutting 和 Mike Cafarella 在這三篇論文的基礎(chǔ)上開發(fā)出了 Hadoop。
但要將多臺(tái)服務(wù)器聯(lián)合在一起進(jìn)行分布式存儲(chǔ),顯然不是那么容易。Hadoop1.0 的時(shí)候,Hdfs 還是有一些隱患的。舉個(gè)例子,用分布式進(jìn)行數(shù)據(jù)存儲(chǔ),那就需要一個(gè)來(lái)記錄元數(shù)據(jù)的服務(wù)器,也就是記錄數(shù)據(jù)存儲(chǔ)位置的服務(wù)器。Hadoop1.0 時(shí)候的 Hdfs 是用一個(gè) namenode 管理元數(shù)據(jù)的,但顯然,只有一個(gè) namenode 來(lái)存儲(chǔ)元數(shù)據(jù)有極大的風(fēng)險(xiǎn),那就是 namenode 的可靠性無(wú)法保證,一旦這個(gè) namenode 掛掉,整個(gè)集群就完蛋了。
好在這些問(wèn)題及時(shí)得到修復(fù),Hadoop2.0 橫空出世,解決了大部分的問(wèn),比如上面說(shuō)到的 NameNode 單點(diǎn)故障問(wèn)題,解決方式就是多引入一臺(tái) NameNode 做同步備份,一個(gè) NameNode 出問(wèn)題時(shí)另一個(gè)跳出來(lái)扛。升級(jí)過(guò)后,Hadoop Hdfs 這才算是坐穩(wěn)了大數(shù)據(jù)存儲(chǔ)王者的寶座。
在這里我們就先不說(shuō) Hadoop Hdfs 的架構(gòu)如何,依舊是從上面說(shuō)到的大數(shù)據(jù)存儲(chǔ)的三個(gè)指標(biāo)速度,容量,容錯(cuò)性這幾個(gè)方面來(lái)看 Hadoop Hdfs。
●速度: 速度方面的優(yōu)勢(shì)源于 Hdfs 合理的設(shè)計(jì)理念。它默認(rèn)用到 Hdfs 處理的是大的數(shù)據(jù)(TB,PB 級(jí)的數(shù)據(jù)),并且摒棄了傳統(tǒng)文件系統(tǒng)中的 Update 操作,只有 Append 操作。在這個(gè)基礎(chǔ)上,Hdfs 將一個(gè)文件分割成若干個(gè)塊(Block),每個(gè)塊分布在不同的機(jī)器中。。和 RAID 利用多個(gè)磁盤并發(fā) IO 提高速度一樣,每次操作一個(gè)文件的時(shí)候,實(shí)際上是多個(gè)機(jī)器在并發(fā)讀取,這樣無(wú)疑是進(jìn)一步提高讀取速度。
●容量: 容量這個(gè)問(wèn)題自不必說(shuō),理論上是可以無(wú)限制得擴(kuò)容。但實(shí)際上由于它的元數(shù)據(jù)存儲(chǔ)在一臺(tái) namenode 中,所以它的大小還是會(huì)收到元數(shù)據(jù)存儲(chǔ)的這個(gè)限制。不過(guò)在 Hadoop2.0 后,在機(jī)器條件允許的情況下,一個(gè) Hdfs 支撐起 PB 級(jí)別的存儲(chǔ)還是綽綽有余的。
●容錯(cuò)性: 在容錯(cuò)性這個(gè)方面,從以前到現(xiàn)在基本都是通過(guò)數(shù)據(jù)冗余來(lái)實(shí)現(xiàn)的。只不過(guò)數(shù)據(jù)冗余的一些策略會(huì)根據(jù)不同的應(yīng)用場(chǎng)景而做出一些改變。由于 Hadoop 本身就是假設(shè)部署在多臺(tái)廉價(jià)機(jī)器上,所以它會(huì)傾向于將存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn)當(dāng)作不可靠的節(jié)點(diǎn)。出于這個(gè)因素,Hdfs 的默認(rèn)冗余備份數(shù)是 3份 ,就是說(shuō)當(dāng)你向 Hdfs 寫入一份數(shù)據(jù)的時(shí)候,同時(shí)會(huì)在其他三臺(tái)機(jī)器上也寫入相同的內(nèi)容。
我們可以發(fā)現(xiàn),其實(shí) Hadoop Hdfs 和 RAID 在思想上是有一些相似之處的。都是通過(guò)水平拓展,比如 RAID 水平拓展磁盤,Hadoop Hdfs 則是水平拓展機(jī)器。
鐵打的營(yíng)盤流水的兵。數(shù)據(jù)就是那些兵,大數(shù)據(jù)計(jì)算框架,比如 Spark,Hive 是將軍。而營(yíng)盤就是 Hadoop Hdfs 了。兵進(jìn)進(jìn)出出,將軍換了一個(gè)又一個(gè),唯獨(dú)營(yíng)盤不會(huì)變,Hadoop Hdfs 無(wú)疑是大數(shù)據(jù)體系中最基礎(chǔ)也是最重要的那一環(huán)。