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

什么是HDFS?算了,告訴你也不懂

存儲 存儲軟件
隨著數(shù)據(jù)量越來越大,在一臺機(jī)器上已經(jīng)無法存儲所有的數(shù)據(jù)了,那我們會將這些數(shù)據(jù)分配到不同的機(jī)器來進(jìn)行存儲,但是這就帶來一個問題:不方便管理和維護(hù)

 [[317197]]

一、HDFS介紹

上篇文章已經(jīng)講到了,隨著數(shù)據(jù)量越來越大,在一臺機(jī)器上已經(jīng)無法存儲所有的數(shù)據(jù)了,那我們會將這些數(shù)據(jù)分配到不同的機(jī)器來進(jìn)行存儲,但是這就帶來一個問題:不方便管理和維護(hù)。

所以,我們就希望有一個系統(tǒng)可以將這些分布在不同操作服務(wù)器上的數(shù)據(jù)進(jìn)行統(tǒng)一管理,這就有了分布式文件系統(tǒng)。

  • HDFS是分布式文件系統(tǒng)的其中一種(目前用得最廣泛的一種)

在使用HDFS的時候是非常簡單的:雖然HDFS是將文件存儲到不同的機(jī)器上,但是我去使用的時候是把這些文件當(dāng)做是存儲在一臺機(jī)器的方式去使用(背后卻是多臺機(jī)器在執(zhí)行):

  • 好比:我調(diào)用了一個RPC接口,我給他參數(shù),他返回一個response給我。RPC接口做了什么事其實我都不知道的(可能這個RPC接口又調(diào)了其他的RPC接口)-----屏蔽掉實現(xiàn)細(xì)節(jié),對用戶友好。

HDFS使用

明確一下:HDFS就是一個分布式文件系統(tǒng),一個文件系統(tǒng),我們用它來做什么?存數(shù)據(jù)呀。

下面,我們來了解一下HDFS的一些知識,能夠幫我們更好地去「使用」HDFS

二、HDFS學(xué)習(xí)

從上面我們已經(jīng)提到了,HDFS作為一個分布式文件系統(tǒng),那么它的數(shù)據(jù)是保存在多個系統(tǒng)上的。例如,下面的圖:一個1GB的文件,會被切分成幾個小的文件,每個服務(wù)器都會存放一部分。

那肯定會有人會問:那會切分多少個小文件呢?默認(rèn)以128MB的大小來切分,每個128MB的文件,在HDFS叫做塊(block)。

顯然,這個128MB大小是可配的。如果設(shè)置為太小或者太大都不好。如果切分的文件太小,那一份數(shù)據(jù)可能分布到多臺的機(jī)器上(尋址時間就很慢)。如果切分的文件太大,那數(shù)據(jù)傳輸時間的時間就很慢。

PS:老版本默認(rèn)是64MB

一個用戶發(fā)出了一個1GB的文件請求給HDFS客戶端,HDFS客戶端會根據(jù)配置(現(xiàn)在默認(rèn)是128MB),對這個文件進(jìn)行切分,所以HDFS客戶端會切分為8個文件(也叫做block),然后每個服務(wù)器都會存儲這些切分后的文件(block)?,F(xiàn)在我們假設(shè)每個服務(wù)器都存儲兩份。

這些存放真實數(shù)據(jù)的服務(wù)器,在HDFS領(lǐng)域叫做DataNode。

現(xiàn)在問題來了,HDFS客戶端按照配置切分完以后,怎么知道往哪個服務(wù)器(DataNode)放數(shù)據(jù)呢?這個時候,就需要另一個角色了,管理者(NameNode)。

NameNode實際上就是管理文件的各種信息(這種信息專業(yè)點我們叫做MetaData「元數(shù)據(jù)」),其中包括:文文件路徑名,每個Block的ID和存放的位置等等。

所以,無論是讀還是寫,HDFS客戶端都會先去找NameNode,通過NameNode得知相應(yīng)的信息,再去找DataNode。

  • 如果是寫操作,HDFS切分完文件以后,會詢問NameNode應(yīng)該將這些切分好的block往哪幾臺DataNode上寫。
  • 如果是讀操作,HDFS拿到文件名,也會去詢問NameNode應(yīng)該往哪幾臺DataNode上讀數(shù)據(jù)。

2.1 HDFS備份

作為一個分布式系統(tǒng)(把大文件切分為多個小文件,存儲到不同的機(jī)器上),如果沒有備份的話,只要有其中的一臺機(jī)器掛了,那就會導(dǎo)致「數(shù)據(jù)」是不可用狀態(tài)的。

寫到這里,如果看過我的Kafka和ElasticSearch的文章可能就懂了。其實思想都是一樣的。

Kafka對partition備份,ElasticSearch對分片進(jìn)行備份,而到HDFS就是對Block進(jìn)行備份。

盡可能將數(shù)據(jù)備份到不同的機(jī)器上,即便某臺機(jī)器掛了,那就可以將備份數(shù)據(jù)拉出來用。

對Kafka和ElasticSearch不了解的同學(xué),可以關(guān)注我的GitHub,搜索關(guān)鍵字即可查詢(我覺得還算寫得比較通俗易懂的)

注:這里的備份并不需要HDFS客戶端去寫,只要DataNode之間互相傳遞數(shù)據(jù)就好了。

2.2 NameNode的一些事

從上面我們可以看到,NameNode是需要處理hdfs客戶端請求的。(因為它是存儲元數(shù)據(jù)的地方,無論讀寫都需要經(jīng)過它)。

現(xiàn)在問題就來了,NameNode是怎么存放元數(shù)據(jù)的呢?

  • 如果NameNode只是把元數(shù)據(jù)放到內(nèi)存中,那如果NameNode這臺機(jī)器重啟了,那元數(shù)據(jù)就沒了。
  • 如果NameNode將每次寫入的數(shù)據(jù)都存儲到硬盤中,那如果只針對磁盤查找和修改又會很慢(因為這個是純IO的操作)

說到這里,又想起了Kafka。Kafka也是將partition寫到磁盤里邊的,但人家是怎么寫的?順序IO NameNode同樣也是做了這個事:修改內(nèi)存中的元數(shù)據(jù),然后把修改的信息append(追加)到一個名為editlog的文件上。

由于append是順序IO,所以效率也不會低?,F(xiàn)在我們增刪改查都是走內(nèi)存,只不過增刪改的時候往磁盤文件editlog里邊追加一條。這樣我們即便重啟了NameNode,還是可以通過editlog文件將元數(shù)據(jù)恢復(fù)。

現(xiàn)在也有個問題:如果NameNode一直長期運行的話,那editlog文件應(yīng)該會越來越大(因為所有的修改元數(shù)據(jù)信息都需要在這追加一條)。重啟的時候需要依賴editlog文件來恢復(fù)數(shù)據(jù),如果文件特別大,那啟動的時候不就特別慢了嗎?

的確是如此的,那HDFS是怎么做的呢?為了防止editlog過大,導(dǎo)致在重啟的時候需要較長的時間恢復(fù)數(shù)據(jù),所以NameNode會有一個內(nèi)存快照,叫做fsimage

說到快照,有沒有想起Redis的RDB!!

這樣一來,重啟的時候只需要加載內(nèi)存快照fsimage+部分的editlog就可以了。

想法很美好,現(xiàn)實還需要解決一些事:我什么時候生成一個內(nèi)存快照fsimage?我怎么知道加載哪一部分的editlog?

問題看起來好像復(fù)雜,其實我們就只需要一個定時任務(wù)。

如果讓我自己做的話,我可能會想:我們加一份配置,設(shè)置個時間就OK了。

  • 如果editlog大到什么程度或者隔了多長時間,我們就把editlog文件的數(shù)據(jù)跟內(nèi)存快照fsiamge給合并起來。然后生成一個新的fsimage,把editlog給清空,覆蓋舊的fsimage內(nèi)存快照
  • 這樣一來,NameNode每次重啟的時候,拿到的都是最新的fsimage文件,editlog里邊的都是沒合并到fsimage的。根據(jù)這兩個文件就可以恢復(fù)最新的元數(shù)據(jù)信息了。

HDFS也是類似上面這樣干的,只不過它不是在NameNode起個定時的任務(wù)跑,而是用了一個新的角色:SecondNameNode。至于為什么?可能HDFS覺得合并所耗費的資源太大了,不同的工作交由不同的服務(wù)器來完成,也符合分布式的理念。

現(xiàn)在問題還是來了,此時的架構(gòu)NameNode是單機(jī)的。SecondNameNode的作用只是給NameNode合并editlog和fsimage文件,如果NameNode掛了,那client就請求不到了,而所有的請求都需要走NameNode,這導(dǎo)致整個HDFS集群都不可用了。

于是我們需要保證NameNode是高可用的。一般現(xiàn)在我們會通過Zookeeper來實現(xiàn)。架構(gòu)圖如下:

主NameNode和從NameNode需要保持元數(shù)據(jù)的信息一致(因為如果主NameNode掛了,那從NameNode需要頂上,這時從NameNode需要有主NameNode的信息)。

所以,引入了Shared Edits來實現(xiàn)主從NameNode之間的同步,Shared Edits也叫做JournalNode。實際上就是主NameNode如果有更新元數(shù)據(jù)的信息,它的editlog會寫到JournalNode,然后從NameNode會在JournalNode讀取到變化信息,然后同步。從NameNode也實現(xiàn)了上面所說的SecondNameNode功能(合并editlog和fsimage)。

 

稍微總結(jié)一下:

  • NameNode需要處理client請求,它是存儲元數(shù)據(jù)的地方。
  • NameNode的元數(shù)據(jù)操作都在內(nèi)存中,會把增刪改以editlog持續(xù)化到硬盤中(因為是順序io,所以不會太慢)。
  • 由于editlog可能存在過大的問題,導(dǎo)致重新啟動NameNode過慢(因為要依賴editlog來恢復(fù)數(shù)據(jù)),引出了fsimage內(nèi)存快照。需要跑一個定時任務(wù)來合并fsimage和editlog,引出了SecondNameNode。
  • 又因為NameNode是單機(jī)的,可能存在單機(jī)故障的問題。所以我們可以通過Zookeeper來維護(hù)主從NameNode,通過JournalNode(Share Edits)來實現(xiàn)主從NameNode元數(shù)據(jù)的一致性。最終實現(xiàn)NameNode的高可用。

2.3 學(xué)點DataNode

從上面我們就知道,我們的數(shù)據(jù)是存放在DataNode上的(還會備份)。

如果某個DataNode掉線了,那HDFS是怎么知道的呢?

DataNode啟動的時候會去NameNode上注冊,他倆會維持心跳,如果超過時間閾值沒有收到DataNode的心跳,那HDFS就認(rèn)為這個DataNode掛了。

還有一個問題就是:我們將Block存到DataNode上,那還是有可能這個DataNode的磁盤損壞了部分,而我們DataNode沒有下線,但我們也不知道損壞了。

一個Block除了存放數(shù)據(jù)的本身,還會存放一份元數(shù)據(jù)(包括數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗和,以及時間戳)。DataNode還是會定期向NameNode上報所有當(dāng)前所有Block的信息,通過元數(shù)據(jù)就可校驗當(dāng)前的Block是不是正常狀態(tài)。

最后

其實在學(xué)習(xí)HDFS的時候,你會發(fā)現(xiàn)很多的思想跟之前學(xué)過的都類似。就比如提到的Kafka、Elasticsearch這些常用的分布式組件。

如果對Kafka、Elasticsearch、Zookeeper、Redis等不了解的同學(xué),可以在我的GitHub或公眾號里邊找對應(yīng)的文章哦~我覺得還算寫得通俗易懂的。

改天整合一下這些框架的持久化特點,再寫一篇。(因為可以發(fā)現(xiàn),他們的持久化機(jī)制都十分類似)

 

責(zé)任編輯:武曉燕 來源: Java3y
相關(guān)推薦

2021-02-27 10:38:56

Python結(jié)構(gòu)數(shù)據(jù)

2014-10-16 09:30:31

RFID

2015-03-02 10:08:09

Apple Watch

2021-04-15 09:37:05

大數(shù)據(jù)Maven

2012-07-03 16:56:12

Hadoop

2011-03-07 09:44:09

赤裸的密碼密碼

2012-08-30 10:51:42

云計算Citrix

2019-12-25 10:45:30

Java悲觀鎖

2019-12-19 17:00:01

Java線程

2019-08-08 18:14:43

戴爾

2021-03-01 18:38:32

Mock測試軟件

2017-10-19 21:56:55

數(shù)據(jù)可視化大數(shù)據(jù)數(shù)據(jù)

2012-05-17 15:28:54

云計算

2010-01-14 14:54:31

什么是三層交換機(jī)

2023-10-26 21:41:45

云計算企業(yè)云基礎(chǔ)

2018-03-28 21:40:03

2018-02-25 11:00:05

2016-06-02 11:02:02

機(jī)器學(xué)習(xí)

2010-08-19 21:29:13

存儲虛擬化

2013-03-04 10:38:26

數(shù)字大數(shù)據(jù)故事
點贊
收藏

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