自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

海量數(shù)據(jù)怎么存?HDFS 是什么?架構(gòu)是怎么樣的?

開發(fā) 架構(gòu)
HDFS, 全名 Hadoop Distributed File System,是大數(shù)據(jù)領(lǐng)域常用的分布式文件系統(tǒng)。你可以將它當(dāng)做 應(yīng)用服務(wù)和多個(gè)服務(wù)器文件系統(tǒng)的中間層,幫應(yīng)用屏蔽掉背后的多個(gè)服務(wù)器,從多個(gè)服務(wù)器上讀寫文件數(shù)據(jù),

你是一個(gè)程序員,你太想進(jìn)步了,于是準(zhǔn)備下載 256g 的學(xué)習(xí)資料,放到電腦硬盤上。

但你的電腦最多只能存放 128g 數(shù)據(jù)。怎么辦呢?

好辦,你衣柜里還有臺(tái)大學(xué)時(shí)的舊電腦。平分一下,正好夠放。下崗機(jī)器再就業(yè),你感覺你是個(gè)天才。

可麻繩總挑細(xì)處斷,舊電腦磁盤終究還是寫壞了。

于是你選擇從衣柜里再拿兩臺(tái)舊電腦做備份。這樣就不怕磁盤壞了。

但這個(gè)切分?jǐn)?shù)據(jù)和備份數(shù)據(jù)的過(guò)程每次都得手動(dòng)操作。

手動(dòng)切分和備份數(shù)據(jù)

不僅容易出錯(cuò),還賊浪費(fèi)時(shí)間!

有解法嗎?

有,沒有什么是加一層中間層不能解決的,如果有,那就再加一層。

這次我們要加的中間層是 HDFS。

hdfs

HDFS 是什么?

HDFS, 全名 Hadoop Distributed File System,是大數(shù)據(jù)領(lǐng)域常用的分布式文件系統(tǒng)。

你可以將它當(dāng)做 應(yīng)用服務(wù)和多個(gè)服務(wù)器文件系統(tǒng)的中間層,幫應(yīng)用屏蔽掉背后的多個(gè)服務(wù)器,從多個(gè)服務(wù)器上讀寫文件數(shù)據(jù)。

并通過(guò)一系列策略保證數(shù)據(jù)可靠性,就算某些服務(wù)器磁盤壞了,也不影響數(shù)據(jù)完整。

hdfs是應(yīng)用服務(wù)和多個(gè)服務(wù)器文件系統(tǒng)的中間層

我們來(lái)看下它是怎么做到的。

數(shù)據(jù)塊是什么

如果你有個(gè)超大文件,該怎么將它們存到多臺(tái)服務(wù)器磁盤上呢?

按理說(shuō)直接挑一臺(tái)磁盤充足的服務(wù)器寫入就好了,但如果每臺(tái)服務(wù)器的剩余磁盤空間都不足以存下這個(gè)大文件呢?

好辦, 我們可以將大文件切成多個(gè)數(shù)據(jù)塊,也就是 block, 每個(gè)數(shù)據(jù)塊默認(rèn) 128MB。

數(shù)據(jù)塊

這個(gè)大小的數(shù)據(jù)塊正好可以寫入到多個(gè)服務(wù)器磁盤的犄角旮旯里,既完成了大文件的存儲(chǔ),又提升了磁盤空間利用率。

容錯(cuò)

但如果這時(shí)候某臺(tái)服務(wù)器磁盤被寫壞了,那背后牽連的很多大文件,就全廢了。怎么辦呢?

追愛路上遍體鱗傷的沸羊羊,會(huì)含淚給你答案,當(dāng)然是多養(yǎng)幾個(gè)備胎。

我們可以將數(shù)據(jù)塊復(fù)制幾份出來(lái),分散放到不同服務(wù)器上,就算其中一臺(tái)服務(wù)器跪了,還能從其他服務(wù)器上拿到數(shù)據(jù)塊。分散了風(fēng)險(xiǎn),大大提升了系統(tǒng)容錯(cuò)率!

在其他服務(wù)器上冗余數(shù)據(jù)

但問(wèn)題又來(lái)了,大文件被拆成了多數(shù)據(jù)塊,多副本寫入后。如果程序想讀大文件,怎么知道該從哪個(gè)服務(wù)器里讀呢?

HDFS 架構(gòu)

為了解決上面的問(wèn)題,HDFS 會(huì)將我們的服務(wù)器集群劃為兩部分,一部分是Master 節(jié)點(diǎn),也叫 NameNode,另一部分是Slave 節(jié)點(diǎn),也叫DataNode。

hdfs架構(gòu)

從名字能看出,它們的關(guān)系就是老板和打工人。

NameNode 負(fù)責(zé)管理 DataNode,決定應(yīng)用程序該到哪個(gè) DataNode 去讀寫數(shù)據(jù)塊。DataNode 才是真正負(fù)責(zé)存儲(chǔ)數(shù)據(jù)塊的牛馬。

它們共同構(gòu)成了 HDFS 集群,對(duì)外提供了讀寫文件,以及修改讀寫權(quán)限等一系列能力。

hdfs集群

而且 HDFS 還提供了 CLI 和 API,程序員可以方便地進(jìn)行文件操作,不需要手寫代碼來(lái)處理大文件的拆分和組裝。

可以通過(guò)CLI和API訪問(wèn)hdfs

DataNode 是什么

牛馬 DataNode 負(fù)責(zé)實(shí)際存儲(chǔ)數(shù)據(jù),很辛苦,但它的工作確實(shí)沒什么技術(shù)含量,寫壞了就用另外一塊新的 DataNode 頂上。主打一個(gè)你不干,有的是 DataNode 愿意干。存儲(chǔ)的數(shù)據(jù)量大了,就多加幾個(gè) DataNode。

正因?yàn)?DataNode 每天都需要瘋狂讀寫,所以身體,啊不對(duì),磁盤很容易垮,但是其他 DataNode 上面也備份了文件數(shù)據(jù),可替代性很高,所以不用給它們配太好的服務(wù)器,能跑就行。

datanode使用普通服務(wù)器

反觀 NameNode,就不一樣了,它維護(hù)了所有服務(wù)器集群的信息,是大腦,是核心,金貴的很,所以得用高性能服務(wù)器好生供養(yǎng)著。

不行,越說(shuō)越生氣了。

namenode使用高性能服務(wù)器

我們看下 NameNode 是怎么管理文件的?

NameNode 是什么

我們平時(shí)在電腦上,是通過(guò)目錄樹的形式管理文件。

而在 HDFS 的 NameNode 中,也用類似的目錄樹形式管理文件,每個(gè)文件都有對(duì)應(yīng)文件名、大小和對(duì)應(yīng)地址以及訪問(wèn)權(quán)限。這些信息,我們叫它元數(shù)據(jù)。

元數(shù)據(jù)

這個(gè)管理目錄樹和元數(shù)據(jù)的能力,就叫 NameSpace。

同時(shí) NameNode 還記錄了某個(gè)文件,分成了多少個(gè)數(shù)據(jù)塊這些信息。知道了大文件有哪些數(shù)據(jù)塊后,我們還需要維護(hù)和管理數(shù)據(jù)塊被存在了哪個(gè) DataNode 上,這部分能力叫 Block Manager。

NameNode內(nèi)部

高性能

為了支持高性能讀寫,NameNode 將 NameSpace 和 Block Manager 的數(shù)據(jù)全放內(nèi)存中。

NameNode將數(shù)據(jù)放內(nèi)存

持久化

但放內(nèi)存里有個(gè)大問(wèn)題,進(jìn)程要是崩了,那數(shù)據(jù)就丟了。

怎么辦呢?

我們可以將 NameSpace 和 Block Manager 定期持久化到磁盤文件里,這個(gè)文件就是 fsimage,它記錄了某一時(shí)刻 NameNode 的全量數(shù)據(jù),類似于游戲的"存檔"。

NameNode數(shù)據(jù)存檔

但"存檔"是需要時(shí)間的,在這次存檔完成之后,下一次存檔完成之前,寫入的數(shù)據(jù)是不是會(huì)丟失呢?

好辦,NameNode 會(huì)將"存檔"后寫入了哪些信息,記錄到一個(gè)叫 editlog 的文件里,定時(shí)刷盤。這樣就算進(jìn)程掛了,重啟的時(shí)候,通過(guò)加載 fsimage+editlog, 就能盡可能復(fù)原數(shù)據(jù)。保證了數(shù)據(jù)可靠性。

引入editlog

高可用

想必大家也發(fā)現(xiàn)了,NameNode 是 HDFS 集群的核心,存在單點(diǎn)問(wèn)題,要是崩了,那集群就沒法對(duì)外提供服務(wù)了。

所以為了保證高可用,我們可以為 NameNode 配一個(gè)備用 NameNode, 也就是 Standby NameNode,平時(shí)主 NameNode 負(fù)責(zé)對(duì)外提供讀寫操作,備用 NameNode 只同步 NameNode 的數(shù)據(jù)。

一旦 NameNode 掛了,備用 NameNode 就能立馬頂上。保證了集群高可用。

備用namenode

可擴(kuò)展

但就算用了備用 NameNode,同一時(shí)刻,集群里其實(shí)只有一個(gè) NameNode 對(duì)外工作。

隨著 HDFS 集群規(guī)模變大,NameNode 使用的內(nèi)存也會(huì)變高。換句話說(shuō)就是, HDFS 性能其實(shí)受限于單服務(wù)器節(jié)點(diǎn)的內(nèi)存和 cpu 上限。那有辦法擴(kuò)展嗎?

有!我們知道 NameNode 里的 NameSpace 本質(zhì)上是個(gè)目錄樹。

目錄樹

為了水平擴(kuò)展,我們可以根據(jù)業(yè)務(wù)屬性,對(duì)目錄樹進(jìn)行拆分,也就是變成多個(gè) NameSpace。

根據(jù)業(yè)務(wù)拆分目錄樹

再新增 NameNode,每個(gè) NameNode 各自維護(hù)一個(gè)獨(dú)立的 NameSpace,NameNode 之間完全不需要知道對(duì)方存了哪些數(shù)據(jù),各自都只需要根據(jù) DataNode 當(dāng)前上報(bào)的磁盤信息就能完成讀寫操作。

通過(guò)這個(gè)方式,降低了 NameNode 單節(jié)點(diǎn)壓力,同時(shí)提升了系統(tǒng)擴(kuò)展性。這其實(shí)就是業(yè)界比較經(jīng)典的 HDFS Federation 方案。

HDFS Federation方案

但單個(gè) NameSpace 還是有可能變得很大,怎么辦呢?

好辦,單個(gè) NameSpace 過(guò)大并不合理,再拆小就行了。

這就很靈性了,在你質(zhì)疑我擴(kuò)展性有問(wèn)題之前,我先反過(guò)來(lái)質(zhì)疑你業(yè)務(wù)耦合過(guò)大,是不是能拆一下。在我解決架構(gòu)問(wèn)題之前,先解決掉提出問(wèn)題的人,也不失為一種優(yōu)雅的架構(gòu)師思維。

接下來(lái)我們將上面提到的內(nèi)容串起來(lái)。

寫大文件

  • 客戶端通過(guò) HDFS API 向 NameNode 發(fā)送請(qǐng)求,準(zhǔn)備寫入文件。
  • NameNode 在 NameSpace 中檢查文件路徑的合法性和客戶端寫權(quán)限,ok 的話,NameNode 會(huì)在 Edit Log 中記錄新文件的元數(shù)據(jù)(比如文件路徑、權(quán)限等),再更新 NameSpace。然后,NameNode 響應(yīng)客戶端。
  • 之后客戶端再請(qǐng)求 NameNode ,獲取第一個(gè)數(shù)據(jù)塊寫入到哪些個(gè) DataNode 上。

寫入流程part1

  • NameNode 的Block Manager 會(huì)根據(jù)當(dāng)前存儲(chǔ)情況,告訴客戶端數(shù)據(jù)塊應(yīng)該存儲(chǔ)在哪些 DataNode 上。
  • 客戶端將數(shù)據(jù)塊先寫入主DataNode,DataNode 再將數(shù)據(jù)塊副本同步寫到其他 DataNode 上。
  • 完成第一個(gè)數(shù)據(jù)塊后。客戶端通知 NameNode 數(shù)據(jù)塊已成功寫入。NameNode 更新數(shù)據(jù)塊的時(shí)間戳,最終大小等。再寫入 editlog。

寫入流程part2

  • 客戶端再向 NameNode 獲取第二個(gè)數(shù)據(jù)塊該寫到哪些個(gè) NameNode 上,重復(fù)上面的操作,直到全部寫完。
  • DataNode 將數(shù)據(jù)塊存儲(chǔ)在本地文件系統(tǒng)后,會(huì)定期向 NameNode 匯報(bào)數(shù)據(jù)塊狀態(tài)。

datanode定期上報(bào)狀態(tài)

  • NameNode 將文件的元數(shù)據(jù)變化記錄到 NameSpace EditLog 中。并定期合并 EditLog 到 FsImage,以確保文件系統(tǒng)狀態(tài)一致。
  • 備用 NameNode 會(huì)同步 EditLog 和 FsImage,以便在故障時(shí)可以接管。

備用namenode

通過(guò)上面步驟,HDFS 完成寫入大文件。我們?cè)賮?lái)看下怎么將大文件讀出來(lái)。

讀大文件

  • 客戶端向 NameNode 發(fā)送請(qǐng)求以獲取目標(biāo)文件的元數(shù)據(jù)信息。NameNode 返回文件的 block 列表及其對(duì)應(yīng)的 DataNode 位置。
  • 客戶端根據(jù) NameNode 返回的 DataNode 列表,選擇一個(gè)合適的 DataNode ,建立 TCP 連接,并發(fā)送讀取 block 的請(qǐng)求。
  • DataNode 收到請(qǐng)求后,將 block 數(shù)據(jù)發(fā)給客戶端??蛻舳私邮諗?shù)據(jù)后,用 checksum 校驗(yàn)數(shù)據(jù)完整性。
  • 重復(fù)以上步驟讀取到多個(gè)數(shù)據(jù)塊后,將多個(gè)數(shù)據(jù)塊組裝成大文件,完成讀取。

讀大文件

現(xiàn)在大家通了嗎?

最后

其實(shí)大部分后端開發(fā)平時(shí)不怎么使用 HDFS,但我卻不得不聊下它,它是大數(shù)據(jù)體系的基石。基于 HDFS 的中間件有很多,比如 Hbase, Hive, Spark 等等,隨便拉出一個(gè)來(lái),都是王炸。就算不用,我們也可以學(xué)習(xí)下它們是怎么解決架構(gòu)問(wèn)題的。這在面試上拿出來(lái)吹牛,還不是嘎嘎亂殺?

總結(jié)

- 你可以將 HDFS 當(dāng)做 應(yīng)用服務(wù)和多個(gè)服務(wù)器文件系統(tǒng)的中間層,幫應(yīng)用屏蔽掉背后的多個(gè)服務(wù)器,從多個(gè)服務(wù)器上讀寫文件數(shù)據(jù),

  • HDFS 會(huì)將文件分為多個(gè)數(shù)據(jù)塊,并給數(shù)據(jù)塊配備多個(gè)副本,有效利用磁盤空間的同時(shí),還提升了數(shù)據(jù)可靠性。
  • HDFS 將集群分為 NameNode 和 DataNode 兩部分,NameNode 負(fù)責(zé)管理文件元數(shù)據(jù),DataNode 負(fù)責(zé)正在存儲(chǔ)數(shù)據(jù)塊。
  • NameNode 的內(nèi)存中主要包含 NameSpace 和 block manager 兩部分,NameSpace 負(fù)責(zé)管理目錄樹和元數(shù)據(jù)的組件。Block manager 維護(hù)和管理數(shù)據(jù)塊被存在了哪個(gè) DataNode 上。這些內(nèi)存數(shù)據(jù)會(huì)刷入磁盤上的 fsimage 文件中形成快照,并通過(guò) editlog 記錄用戶寫操作,確保數(shù)據(jù)不丟
  • NameNode 將 NameSpace 和 block manager 加載到內(nèi)存中,保證高性能。同時(shí)將內(nèi)存數(shù)據(jù)會(huì)刷入磁盤上的 fsimage 文件中形成快照,并通過(guò) editlog 記錄用戶寫操作,確保數(shù)據(jù)持久化。為 NameNode 加入備用節(jié)點(diǎn),保證高可用。通過(guò) Federation 方案,提升了系統(tǒng)擴(kuò)展能力。
責(zé)任編輯:姜華 來(lái)源: 小白debug
相關(guān)推薦

2025-01-20 07:00:00

2024-11-25 07:00:00

RedisMySQL數(shù)據(jù)庫(kù)

2024-12-16 08:20:00

2024-06-24 00:07:00

開源es搜索引擎

2024-03-04 08:03:50

k8sClusterNode

2024-05-22 08:02:30

2009-12-24 14:05:06

Fedora core

2023-05-15 10:17:03

2022-08-12 17:14:46

元宇宙

2014-02-18 11:24:07

云計(jì)算PaaS

2017-10-17 15:02:35

RS-485總線布線雙絞線

2014-08-25 10:11:18

極致用戶體驗(yàn)

2020-08-13 12:02:13

前端培訓(xùn)學(xué)習(xí)

2011-05-31 17:27:58

網(wǎng)站權(quán)重

2016-03-09 11:25:39

前端開發(fā)工程師簡(jiǎn)歷

2024-01-03 13:06:50

2023-06-30 08:23:36

Spring!SolonJavalin

2019-07-19 15:42:57

Hadoop大數(shù)據(jù)YuniKorn

2015-07-23 11:49:31

程序猿
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)