一、 HDFS簡介
1.1 HDFS的概述
HDFS是基于 流數(shù)據(jù) 訪問模式的 分布式文件系統(tǒng) ,其設(shè)計(jì)建立在 “一次寫入、多次讀取” 的基礎(chǔ)上,提供高吞吐量、高容錯(cuò)性的數(shù)據(jù)訪問,能很好地解決海量數(shù)據(jù)的存儲(chǔ)問題。
流數(shù)據(jù) 是指數(shù)千個(gè)數(shù)據(jù)源 持續(xù)生成 的數(shù)據(jù),可以理解為隨時(shí)間延續(xù)而 無限增長 的動(dòng)態(tài)數(shù)據(jù)集合。
通俗點(diǎn)說,如果把數(shù)據(jù)比如成一個(gè)水庫,那么流進(jìn)去的水,就是流數(shù)據(jù)(就像我們聽的音樂,屬于音樂流;而看到的文字、圖片這些較為固定的,一次性下載的,形成不了流)。
在Hadoop生態(tài)圈中,HDFS屬于底層基礎(chǔ),負(fù)責(zé)存儲(chǔ)文件。
1.2 HDFS的優(yōu)點(diǎn)
HDFS的優(yōu)點(diǎn):
高容錯(cuò)性。提供了容錯(cuò)和恢復(fù)機(jī)制,副本丟失后,自動(dòng)恢復(fù)。
高可靠性。數(shù)據(jù)自動(dòng)保存多個(gè)副本,通過多副本提高可靠性。
適合大數(shù)據(jù)處理??梢蕴幚沓笪募?,比如 TB級甚至PB級 的文件。
適合批處理。移動(dòng)計(jì)算而非移動(dòng)數(shù)據(jù);數(shù)據(jù)位置暴露給計(jì)算框架。
支持流式數(shù)據(jù)訪問。一次性寫入,多次讀?。ㄒ粋€(gè)數(shù)據(jù)集一旦生成,就會(huì)被復(fù)制分發(fā)到不同的存儲(chǔ)節(jié)點(diǎn),各節(jié)點(diǎn)可以進(jìn)行讀取/訪問);保證數(shù)據(jù)一致性。
低成本運(yùn)行。可以運(yùn)行在低成本的硬件之上。
…
HDFS 默認(rèn)保存 3 份副本。
第一個(gè)副本:放置在 上傳文件 的數(shù)據(jù)節(jié)點(diǎn)(第一個(gè)副本如果是在 集群外 提交,則隨機(jī)挑選一個(gè) CPU 比較空閑 、 磁盤不太滿 的節(jié)點(diǎn));
第二個(gè)副本:放置在與 第一個(gè)副本 不同 的機(jī)架的節(jié)點(diǎn)上;
第三個(gè)副本:放在與 第二個(gè)副本 相同 的機(jī)架的其他節(jié)點(diǎn)上。
1.3 HDFS的缺點(diǎn)
HDFS的缺點(diǎn):
不適合處理 低延遲 的數(shù)據(jù)訪問。比如用戶 要求時(shí)間比較短 的低延遲應(yīng)用(主要處理高數(shù)據(jù)吞吐量的應(yīng)用)。
不適合處理 大量的小 文件。會(huì)造成尋址時(shí)間超過讀取時(shí)間;會(huì)占用NameNode大量內(nèi)存,因?yàn)镹ameNode把文件系統(tǒng)的元數(shù)據(jù)存放在內(nèi)存中(文件系統(tǒng)的容量由NameNode的大小決定),小文件太多會(huì)消耗NameNode的內(nèi)存。
不適合 并發(fā)寫入。一個(gè)文件只能有一個(gè)寫入者,HDFS暫不支持多個(gè)用戶對同一個(gè)文件的寫操作。
不適合 任意修改 文件。僅支持append(附加),不支持在文件的任意位置進(jìn)行修改。
…
二、 HDFS的組成與架構(gòu)
HDFS的組成架構(gòu)圖及各部分功能如下所示:
2.1 NameNode節(jié)點(diǎn)
當(dāng)用戶訪問數(shù)據(jù)文件時(shí),為了保證能夠讀取到每一個(gè)數(shù)據(jù)塊, HDFS有一個(gè)專門 負(fù)責(zé)保存文件屬性信息的節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)就是 NameNode 節(jié)點(diǎn)(即 名稱節(jié)點(diǎn) )。
2.1.1 節(jié)點(diǎn)職責(zé)
NameNode節(jié)點(diǎn) 是HDFS的管理者,負(fù)責(zé)保存和管理HDFS的元數(shù)據(jù)。
其職責(zé)有以下三個(gè)方面:
① 管理維護(hù)HDFS的命名空間
NameNode管理HDFS系統(tǒng)的命名空間,維護(hù)文件系統(tǒng)樹以及文件系統(tǒng)樹中所有文件的元數(shù)據(jù)。管理這些信息的的文件分別是 edits(操作日志文件) 和 fsimage(命名空間鏡像文件) 。
editlog(操作日志):在NameNode啟動(dòng)的情況下,對HDFS進(jìn)行的各種操作進(jìn)行記錄。(HDFS客戶端執(zhí)行的所有操作都會(huì)被記錄到editlog文件中,這些文件由edits文件保存)
fsimage:包含HDFS中的元信息(比如修改時(shí)間、訪問時(shí)間、數(shù)據(jù)塊信息等)。
② 管理DataNode上的數(shù)據(jù)塊
負(fù)責(zé)管理數(shù)據(jù)塊上所有的元數(shù)據(jù)信息(管理DataNode上數(shù)據(jù)塊的均衡,維持副本數(shù)量)。
③ 接收客戶端的請求
接收客戶端文件上傳、下載、創(chuàng)建目錄等的請求。
2.2 DataNode節(jié)點(diǎn)
HDFS首先把大文件切分成若干個(gè)小的數(shù)據(jù)塊,再把這些數(shù)據(jù)塊寫入不同的節(jié)點(diǎn),這個(gè) 負(fù)責(zé)保存文件數(shù)據(jù)的節(jié)點(diǎn)就是 DataNode 節(jié)點(diǎn)(即 數(shù)據(jù)節(jié)點(diǎn) )。
2.2.1 節(jié)點(diǎn)職責(zé)
DataNode節(jié)點(diǎn) 負(fù)責(zé)存儲(chǔ)數(shù)據(jù),把Block(數(shù)據(jù)塊)以Linux文件的形式保存在磁盤上,并根據(jù)Block標(biāo)識和字節(jié)范圍來讀寫塊數(shù)據(jù)。
其職責(zé)有以下三個(gè)方面:
① 保存數(shù)據(jù)塊
一個(gè)數(shù)據(jù)塊會(huì)在多個(gè)DataNode進(jìn)行冗余備份(在某一個(gè)DataNode最多只有一個(gè)備份)。
② 負(fù)責(zé)客戶端對數(shù)據(jù)塊的IO請求
在客戶端執(zhí)行寫操作時(shí),DataNode之間會(huì)相互通信,保證寫操作的一致性。
③ 定期和NameNode進(jìn)行心跳通信,接受NameNode的指令
如果NameNode節(jié)點(diǎn)10分鐘沒有收到DataNode的心跳信息,就會(huì)將其上的數(shù)據(jù)塊復(fù)制到其他DataNode節(jié)點(diǎn)。
因此,NameNode節(jié)點(diǎn)上并不會(huì)永久保存DataNode節(jié)點(diǎn)上的數(shù)據(jù)塊信息,而是通過與DataNode節(jié)點(diǎn)心跳聯(lián)系的方式,來更新節(jié)點(diǎn)上的映射表,以此減輕負(fù)擔(dān)。
問題:HDFS數(shù)據(jù)塊默認(rèn)大小為128M(Hadoop2.2之前為64M),將HDFS的數(shù)據(jù)塊設(shè)置得很大的目的是什么?(傳統(tǒng)數(shù)據(jù)塊只有512個(gè)字節(jié))
答:為了減少尋址開銷,讓HDFS的文件傳輸時(shí)間由傳輸速率決定(如果塊設(shè)置得足夠大,從磁盤 傳輸數(shù)據(jù)的時(shí)間 會(huì)明顯大于 定位這個(gè)塊開始位置 所需的時(shí)間)。
2.3 SecondaryNameNode節(jié)點(diǎn)
HDFS有一個(gè)定期創(chuàng)建命名空間的檢查點(diǎn)(CheckPoint)操作的節(jié)點(diǎn),也就是SecondaryNameNode節(jié)點(diǎn)(即 第二名稱節(jié)點(diǎn))。
出于可靠性考慮,SecondaryNameNode節(jié)點(diǎn)與NameNode節(jié)點(diǎn)通常運(yùn)行在不同的機(jī)器上,且SecondaryNameNode節(jié)點(diǎn)與NameNode節(jié)點(diǎn)的內(nèi)存要一樣大。
(如果想了解 SecondaryNameNode 的工作流程,可以參考這篇文章:淺析 SecondaryNameNode 的工作流程 )
問題:一般情況下,一個(gè)集群中的SecondaryNameNode節(jié)點(diǎn)也是只有一個(gè)的原因是什么?
答:因?yàn)槿绻嗟脑挘瑫?huì)增加NameNode的壓力,使其忙于元數(shù)據(jù)的傳輸/接收、日志的傳輸/切換,從而導(dǎo)致性能下降;同時(shí),NameNode節(jié)點(diǎn)也不支持做并發(fā)檢查點(diǎn)。
2.3.1 節(jié)點(diǎn)職責(zé)
SecondaryNameNode節(jié)點(diǎn) 定期把NameNode的 fsimage 和 edits 下載到本地,再將它們加載到內(nèi)存并進(jìn)行合并,最后把合并后新的 fsimage 返回NameNode (這個(gè)過程稱為檢查點(diǎn))。
經(jīng)典問題:NameNode與SecondaryNameNode有沒有關(guān)系?
SecondaryNameNode節(jié)點(diǎn)的工作流程可以參考這篇文章:
其職責(zé)有以下兩個(gè)方面:
① 防止edits過大
定期合并 fsimage 和 edits 文件,使 edits 大小保持在限制范圍內(nèi)。這樣做減少了重新啟動(dòng)NameNode時(shí)合并 fsimage 和 edits 耗費(fèi)的時(shí)間,從而減少了NameNode啟動(dòng)的時(shí)間。
② 做冷備份
對一定范圍內(nèi)數(shù)據(jù)做快照性備份,在NameNode失效時(shí)能恢復(fù)部分 fsimage 。
好了,HDFS 及其組成框架介紹完成。
如果想進(jìn)一步了解 HDFS 的工作機(jī)制,可以參考這篇文章:圖文詳解 HDFS 工作機(jī)制及其原理 。
編輯:lyn
-
HDFS
+關(guān)注
關(guān)注
1文章
30瀏覽量
9589
發(fā)布評論請先 登錄
相關(guān)推薦
評論