企業(yè)網(wǎng)站建設(shè)的目的是什么小學(xué)生一分鐘新聞播報(bào)
三、Hadoop分布式文件系統(tǒng)
1. 產(chǎn)生背景
-
數(shù)據(jù)量越來(lái)越大,一臺(tái)獨(dú)立的計(jì)算機(jī)已經(jīng)無(wú)法存儲(chǔ)所有的數(shù)據(jù)---->將大規(guī)模的數(shù)據(jù)存儲(chǔ)到成百上千的計(jì)算機(jī)中------為了解決數(shù)據(jù)管理以及維護(hù)極其繁瑣與低效------>分布式文件系統(tǒng)
-
分布式文件系統(tǒng)是管理網(wǎng)絡(luò)中跨多臺(tái)計(jì)算機(jī)存儲(chǔ)的文件系統(tǒng)
-
GFS:谷歌公司開發(fā)了第一個(gè)大規(guī)模商業(yè)化應(yīng)用的分布式文件系統(tǒng)
2. 概述
2.1 分布式文件系統(tǒng)簡(jiǎn)介
-
普通文件系統(tǒng):一般會(huì)把磁盤空間劃分為每512字節(jié)一組,稱為“磁盤塊”,它是文件系統(tǒng)讀寫操作的最小單位,文件系統(tǒng)的塊(Block)通常是磁盤塊的整數(shù)倍,即每次讀寫的數(shù)據(jù)量必須是磁盤塊大小的整數(shù)倍(以塊為單位進(jìn)行讀寫)
-
分布式文件系統(tǒng):也采用了塊的概念,文件被分成若干個(gè)塊進(jìn)行存儲(chǔ),塊是數(shù)據(jù)讀寫的基本單元,只不過(guò)分布式文件系統(tǒng)的塊要比普通文件系統(tǒng)中的塊大很多,比如,HDFS默認(rèn)的一個(gè)塊的大小是64MB,而且與普通文件系統(tǒng)不同的是,在分布式文件系統(tǒng)中,如果一個(gè)文件小于一個(gè)數(shù)據(jù)塊的大小,它不會(huì)占用整個(gè)數(shù)據(jù)塊的儲(chǔ)存空間。(依然是塊為基本單元,但塊更大,同時(shí),不滿一個(gè)塊的文件也不會(huì)占用整塊存儲(chǔ)空間,其他文件依然可以進(jìn)行填充)
-
塊比較大的目的:最小化尋址開銷(HDFS尋址開銷包括:磁盤的尋道開銷和數(shù)據(jù)塊的定位開銷)
-
也不能太大:會(huì)影響并行的速度
-
設(shè)計(jì):客戶機(jī)/服務(wù)器(Client/Server)(客戶端以特定的通信協(xié)議通過(guò)網(wǎng)絡(luò)與服務(wù)器建立連接,提出文件訪問(wèn)請(qǐng)求,客戶端和服務(wù)器可以通過(guò)設(shè)置訪問(wèn)權(quán),來(lái)限制請(qǐng)求方對(duì)底層數(shù)據(jù)存儲(chǔ)塊的訪問(wèn))
-
物理結(jié)構(gòu):由計(jì)算機(jī)集群中的多個(gè)節(jié)點(diǎn)構(gòu)成的(節(jié)點(diǎn)分為兩類)
- 主節(jié)點(diǎn)(Master Node)/名稱節(jié)點(diǎn)(Name Node):負(fù)責(zé)文件和目錄的創(chuàng)建、刪除和重命名等,同時(shí)管理著數(shù)據(jù)節(jié)點(diǎn)和文件塊的映射關(guān)系
- 從節(jié)點(diǎn)(Worker Node)/ 數(shù)據(jù)節(jié)點(diǎn)(DataNode):負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀取。
-
存儲(chǔ)方式:多副本存儲(chǔ)(文件被復(fù)制多次被放在不同的位置,從而能夠保障數(shù)據(jù)的完整性)
-
2.2 HDFS簡(jiǎn)介
- **HDFS(Hadoop Distribute File System)**是大數(shù)據(jù)領(lǐng)域一種非??煽康拇鎯?chǔ)系統(tǒng),它以分布式方式存儲(chǔ)超大數(shù)據(jù)量文件,但它并不適合存儲(chǔ)大量的小數(shù)據(jù)量文件。
- HDFS要實(shí)現(xiàn)的目標(biāo):
- **兼容廉價(jià)的硬件設(shè)備:**實(shí)現(xiàn)在硬件故障的情況下也能保障數(shù)據(jù)的完整性
- **流數(shù)據(jù)讀寫:**不支持隨機(jī)讀寫的操作
- **大數(shù)據(jù)集:**數(shù)據(jù)量一般在GB、TB以上的級(jí)別
- **簡(jiǎn)單的文件模型:**一次寫入、多次讀取
- **強(qiáng)大的跨平臺(tái)兼容性:**采用
Java
語(yǔ)言實(shí)現(xiàn)
- HDFS的局限性:
- 不適合低延遲數(shù)據(jù)訪問(wèn):HDFS主要是面向大規(guī)模數(shù)據(jù)批量處理而設(shè)計(jì)的,采用流式數(shù)據(jù)讀取,具有很高的數(shù)據(jù)吞吐率,但是,這也意味著較高的延遲,因此,HDFS不適合用在需要較低延遲(如數(shù)十毫秒)的應(yīng)用場(chǎng)合。
- **無(wú)法高效存儲(chǔ)大量小文件:**小文件是指文件大小小于一個(gè)塊的文件,HDFS無(wú)法高效存儲(chǔ)和處理大量的小文件,過(guò)多小文件會(huì)給系統(tǒng)擴(kuò)展性和性能帶來(lái)諸多問(wèn)題:
- HDFS采用名稱節(jié)點(diǎn)(NameNode)來(lái)管理文件系統(tǒng)的元數(shù)據(jù),這些元數(shù)據(jù)被保存在內(nèi)存中,使客戶端可以快速獲取文件實(shí)際存儲(chǔ)位置。
- 用MapReduce處理大量小文件時(shí),會(huì)產(chǎn)生過(guò)多的Map任務(wù),線程管理開銷會(huì)大大增加,因此處理大量小文件的速度遠(yuǎn)遠(yuǎn)低于處理同等大小的大文件的速度;
- 訪問(wèn)大量小文件的速度遠(yuǎn)遠(yuǎn)低于訪問(wèn)大文件的速度,因?yàn)樵L問(wèn)大量小文件,需要不斷從一個(gè)數(shù)據(jù)節(jié)點(diǎn)跳到另一個(gè)數(shù)據(jù)節(jié)點(diǎn),嚴(yán)重影響性能。
- 不支持多用戶寫入及任意修改文件:HDFS只允許一個(gè)文件有一個(gè)寫入者,不允許多個(gè)用戶對(duì)同一個(gè)文件執(zhí)行寫操作,而且只允許對(duì)文件執(zhí)行追加操作,不能執(zhí)行隨機(jī)寫操作。
3. HDFS的體系結(jié)構(gòu)
- 結(jié)構(gòu)模型:主從(Master/Slave)結(jié)構(gòu)模型,一個(gè)HDFS集群包括一個(gè)名稱節(jié)點(diǎn)和若干數(shù)據(jù)節(jié)點(diǎn)
- 名稱節(jié)點(diǎn)作為中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的命名空間及客戶端對(duì)文件的訪問(wèn)
- 數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)處理文件系統(tǒng)客戶端的讀/寫請(qǐng)求,在名稱節(jié)點(diǎn)的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制等操作
- 每個(gè)數(shù)據(jù)節(jié)點(diǎn)會(huì)周期性地向名稱節(jié)點(diǎn)發(fā)送**“心跳"信息**,報(bào)告自己的狀態(tài),沒有按時(shí)發(fā)送心跳信息的數(shù)據(jù)節(jié)點(diǎn)會(huì)被標(biāo)記為“宕機(jī)”,不會(huì)再給它分配任何I/O請(qǐng)求。(用來(lái)判斷數(shù)據(jù)節(jié)點(diǎn)是否正常工作的方式)
- 文件存儲(chǔ):一個(gè)文件被分為若干數(shù)據(jù)塊----->若干數(shù)據(jù)塊存儲(chǔ)到若干數(shù)據(jù)節(jié)點(diǎn)上
- 訪問(wèn):客戶端-----文件名----->名稱節(jié)點(diǎn)------根據(jù)文件名找到------>數(shù)據(jù)塊 ------數(shù)據(jù)塊存儲(chǔ)信息------->數(shù)據(jù)節(jié)點(diǎn)的位置------節(jié)點(diǎn)位置信息------>客戶端 —直接訪問(wèn)對(duì)應(yīng)位置–>獲得數(shù)據(jù)
4. HDFS的存儲(chǔ)原理
4.1 數(shù)據(jù)的冗余存儲(chǔ)
- 目的:保證系統(tǒng)的容錯(cuò)性和可用性
- 冗余存儲(chǔ)的方式:多副本方式(即一個(gè)數(shù)據(jù)塊的多個(gè)副本會(huì)被分布到不同的數(shù)據(jù)節(jié)點(diǎn)上)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-FEVeGbzh-1676720254593)(null)]
- 優(yōu)點(diǎn):
- 加快數(shù)據(jù)傳輸速度:當(dāng)多個(gè)客戶端需要同時(shí)訪問(wèn)同一個(gè)文件時(shí),可以讓各個(gè)客戶端分別從不同的數(shù)據(jù)塊副本中讀取數(shù)據(jù),這就大大加快了數(shù)據(jù)傳輸速度,實(shí)現(xiàn)了并行操作。
- 容易檢查數(shù)據(jù)錯(cuò)誤:HDFS的數(shù)據(jù)節(jié)點(diǎn)之間通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù),采用多個(gè)副本可以很容易判斷數(shù)據(jù)傳輸是否出錯(cuò)。
- 保證數(shù)據(jù)的可靠性:即使某個(gè)數(shù)據(jù)節(jié)點(diǎn)出現(xiàn)故障失效,也不會(huì)造成數(shù)據(jù)丟失。
4.2 數(shù)據(jù)存取策略
4.2.1 數(shù)據(jù)存放
-
采用了以機(jī)架(Rack)為基礎(chǔ)的數(shù)據(jù)存放策略。一個(gè)HDFS集群通常包含多個(gè)機(jī)架,不同機(jī)架之間的數(shù)據(jù)通信需要經(jīng)過(guò)交換機(jī)或路由器,同一機(jī)架的不同機(jī)器之間數(shù)據(jù)通信不需要交換機(jī)或路由器,因此同一機(jī)架中不同機(jī)器之間的通信要比不同機(jī)架之間機(jī)器的通信帶寬大。
-
HDFS默認(rèn)每個(gè)數(shù)據(jù)節(jié)點(diǎn)都是在不同機(jī)架上的
- 缺點(diǎn):
- 寫入數(shù)據(jù)的時(shí)候不能充分利用同一機(jī)架內(nèi)部機(jī)器之間的帶寬
- 優(yōu)點(diǎn)
- 可以獲得很高的數(shù)據(jù)可靠性,即使一個(gè)機(jī)架發(fā)生故障,位于其他機(jī)架上的數(shù)據(jù)副本仍然可用
- 在讀數(shù)據(jù)的時(shí)候,可以在多個(gè)機(jī)架上并行讀取數(shù)據(jù),大大提高了數(shù)據(jù)讀取速度。
- 可以更容易實(shí)現(xiàn)系統(tǒng)內(nèi)部負(fù)載均衡和錯(cuò)誤糾正。
- 缺點(diǎn):
-
HDFS默認(rèn)的冗余復(fù)制因子是 3,每一個(gè)文件會(huì)被同時(shí)保存到 3 個(gè)地方,其中兩份副本放在同一個(gè)機(jī)架的不同機(jī)器上面,第三個(gè)副本放在不同機(jī)架的機(jī)器上面。
-
HDFS副本的存放策略是:
- 如果是在集群內(nèi)發(fā)起寫操作請(qǐng)求,則把第1個(gè)副本放置在發(fā)起寫操作請(qǐng)求的數(shù)據(jù)節(jié)點(diǎn)上,實(shí)現(xiàn)就近寫入數(shù)據(jù)。如果是來(lái)自集群外部的寫操作,則從集群內(nèi)部挑選一臺(tái)磁盤空間較為充足、CPU不太忙的數(shù)據(jù)節(jié)點(diǎn),作為第1個(gè)副本的存放地。
- 第2個(gè)副本會(huì)被放置在與第1個(gè)副本不同的機(jī)架的數(shù)據(jù)節(jié)點(diǎn)上。
- 第3個(gè)副本會(huì)被放置在與第1個(gè)副本相同的機(jī)架的其他節(jié)點(diǎn)上。
- 如果還有更多的副本,則繼續(xù)從集群中隨機(jī)選擇數(shù)據(jù)節(jié)點(diǎn)進(jìn)行存放
4.2.2 數(shù)據(jù)讀取
- HDFS提供了一個(gè)API,用于確定一個(gè)數(shù)據(jù)節(jié)點(diǎn)所屬的機(jī)架的ID,客戶端可以調(diào)用該API獲取自己所屬機(jī)架的ID。
4.2.3 數(shù)據(jù)復(fù)制
- 流水線復(fù)制:當(dāng)客戶端要向HDFS中寫入一個(gè)文件時(shí),這個(gè)文件會(huì)首先被寫入本地,并被切分成若干個(gè)塊,每個(gè)塊的大小是由HDFS的設(shè)定值來(lái)決定。每個(gè)塊都向HDFS集群中的名稱節(jié)點(diǎn)發(fā)起寫請(qǐng)求,名稱節(jié)點(diǎn)會(huì)根據(jù)系統(tǒng)中各個(gè)數(shù)據(jù)節(jié)點(diǎn)的使用情況,選擇一個(gè)數(shù)據(jù)節(jié)點(diǎn)列表返回給客戶端,然后客戶端就把數(shù)據(jù)首先寫入列表中的第1個(gè)數(shù)據(jù)節(jié)點(diǎn),同時(shí)把列表傳給第1個(gè)數(shù)據(jù)節(jié)點(diǎn),當(dāng)?shù)?個(gè)數(shù)據(jù)節(jié)點(diǎn)接收到一個(gè)塊的數(shù)據(jù)的時(shí)候,將其寫入本地,并且向列表中的第2個(gè)數(shù)據(jù)節(jié)點(diǎn)發(fā)起連接請(qǐng)求,把自己已經(jīng)接收到的數(shù)據(jù)和列表傳給第2個(gè)數(shù)據(jù)節(jié)點(diǎn),當(dāng)?shù)?個(gè)數(shù)據(jù)節(jié)點(diǎn)接收到數(shù)據(jù)的時(shí)候,將其寫入本地,并且向列表中的第3個(gè)數(shù)據(jù)節(jié)點(diǎn)發(fā)起連接請(qǐng)求,依次類推,列表中的多個(gè)數(shù)據(jù)節(jié)點(diǎn)形成一條數(shù)據(jù)復(fù)制的流水線。最后,當(dāng)文件寫完的時(shí)候,數(shù)據(jù)復(fù)制也同時(shí)完成。
4.3 數(shù)據(jù)錯(cuò)誤與恢復(fù)
4.3.1 名稱節(jié)點(diǎn)出錯(cuò)
- 保證名稱節(jié)點(diǎn)安全的方式:
- 把名稱節(jié)點(diǎn)上的元數(shù)據(jù)信息同步存儲(chǔ)到其他文件系統(tǒng)中
- 運(yùn)行一個(gè)第二名稱節(jié)點(diǎn),當(dāng)名稱節(jié)點(diǎn)宕機(jī)以后,利用第二名稱節(jié)點(diǎn)中的元數(shù)據(jù)信息進(jìn)行系統(tǒng)恢復(fù)(仍然會(huì)丟失部分?jǐn)?shù)據(jù))
- 一般是兩者結(jié)合使用,當(dāng)名稱節(jié)點(diǎn)宕機(jī)時(shí),首先到遠(yuǎn)程掛載的網(wǎng)絡(luò)文件系統(tǒng)中獲取備份的元數(shù)據(jù)信息,放到第二名稱節(jié)點(diǎn)上進(jìn)行恢復(fù),并把第二名稱節(jié)點(diǎn)作為名稱節(jié)點(diǎn)來(lái)使用。
4.3.2 數(shù)據(jù)節(jié)點(diǎn)出錯(cuò)
- 每個(gè)數(shù)據(jù)節(jié)點(diǎn)會(huì)定期向名稱節(jié)點(diǎn)發(fā)送“心跳”信息,向名稱節(jié)點(diǎn)報(bào)告自己的狀態(tài)。當(dāng)數(shù)據(jù)節(jié)點(diǎn)發(fā)生故障,或者網(wǎng)絡(luò)發(fā)生斷網(wǎng)時(shí),名稱節(jié)點(diǎn)就無(wú)法收到來(lái)自這些節(jié)點(diǎn)的“心跳”信息,這時(shí),這些節(jié)點(diǎn)就會(huì)被標(biāo)記為“宕機(jī)”,節(jié)點(diǎn)上面的數(shù)據(jù)都會(huì)被標(biāo)記為“不可讀”,名稱節(jié)點(diǎn)不會(huì)再給它們發(fā)送任何I/O請(qǐng)求(與HDFS的體系結(jié)構(gòu)下的內(nèi)容一致)
4.3.3 數(shù)據(jù)出錯(cuò)
- 網(wǎng)絡(luò)傳輸和磁盤錯(cuò)誤等因素都會(huì)造成數(shù)據(jù)錯(cuò)誤??蛻舳嗽谧x取到數(shù)據(jù)后,會(huì)采用
md5
和sha1
對(duì)數(shù)據(jù)塊進(jìn)行校驗(yàn),以確保讀取到正確的數(shù)據(jù)。在文件被創(chuàng)建時(shí),客戶端會(huì)對(duì)每一個(gè)文件塊進(jìn)行信息摘錄,并把這些信息寫入到同一個(gè)路徑的隱藏文件里面。 - 當(dāng)客戶端讀取文件的時(shí)候,會(huì)先讀取該信息文件,然后,利用該信息文件對(duì)每個(gè)讀取的數(shù)據(jù)塊進(jìn)行校驗(yàn)。如果校驗(yàn)出錯(cuò),客戶端就會(huì)請(qǐng)求到另外一個(gè)數(shù)據(jù)節(jié)點(diǎn)讀取該文件塊,并且向名稱節(jié)點(diǎn)報(bào)告這個(gè)文件塊有錯(cuò)誤,名稱節(jié)點(diǎn)會(huì)定期檢查并且重新復(fù)制這個(gè)塊。
5. HDFS的數(shù)據(jù)讀取過(guò)程
- 參考此鏈接