HDFS是Hadoop Distribute File System的簡(jiǎn)稱,Hadoop的一個(gè)分布式文件系統(tǒng)
HDFS的優(yōu)缺點(diǎn)
HDFS優(yōu)點(diǎn)
- 高容錯(cuò)性
- 數(shù)據(jù)保存多個(gè)副本沉填,完全分布式模式默認(rèn)為3個(gè)副本
- 數(shù)據(jù)丟失后自動(dòng)恢復(fù)
- 適合移動(dòng)批處理
- 移動(dòng)計(jì)算而移動(dòng)數(shù)據(jù)
- 數(shù)據(jù)位置暴露給計(jì)算框架
- 適合大數(shù)據(jù)處理
- GB、TB甚至PB級(jí)的數(shù)據(jù)處理
- 百萬規(guī)模以上的文件數(shù)據(jù)
- 10000+的節(jié)點(diǎn)
- 可構(gòu)建在廉價(jià)的機(jī)器上
- 通過多副本存儲(chǔ),提供可靠性
- 提供了容器和恢復(fù)機(jī)制
HDFS缺點(diǎn)
- 低延遲數(shù)據(jù)訪問處理較弱
- 毫秒級(jí)別的訪問響應(yīng)較慢
- 低延遲和高吞吐的請(qǐng)求處理較弱
- 大量小文件存取處理較弱
- 會(huì)占用大量NameNode的內(nèi)存
- 尋到時(shí)間超過讀取時(shí)間
- 并發(fā)寫入、文件隨機(jī)修改
- 一個(gè)文件僅有一個(gè)寫者
- 僅支持Append寫入
HDFS 架構(gòu)
HDFS采用master/slave架構(gòu)题山。
一個(gè)HDFS集群是由一個(gè)Namenode和一定數(shù)目的Datanodes組成。
- NameNode :是Master節(jié)點(diǎn)故痊,是大領(lǐng)導(dǎo)顶瞳。管理數(shù)據(jù)塊映射;處理客戶端的讀寫請(qǐng)求愕秫;配置副本策略慨菱;管理HDFS的名稱空間
- SecondaryNameNode:是一個(gè)小弟,分擔(dān)大哥namenode的一部分工作量豫领;是NameNode的冷備份抡柿;合并fsimage和fsedits然后再發(fā)給namenode
- DataNode: Slave節(jié)點(diǎn),奴隸等恐,干活的洲劣。負(fù)責(zé)存儲(chǔ)client發(fā)來的數(shù)據(jù)塊block;執(zhí)行數(shù)據(jù)塊的讀寫操作
- 熱備份:b是a的熱備份课蔬,如果a壞掉囱稽。那么b馬上運(yùn)行代替a的工作
- 冷備份:b是a的冷備份,如果a壞掉二跋。那么b不能馬上代替a工作战惊。但是b上存儲(chǔ)a的一些信息,減少a壞掉之后的損失
- fsimage:元數(shù)據(jù)鏡像文件(文件系統(tǒng)的目錄樹)
- edits:元數(shù)據(jù)的操作日志(針對(duì)文件系統(tǒng)做的修改操作記錄
- namenode內(nèi)存中存儲(chǔ)的是=fsimage+edits
- SecondaryNameNode負(fù)責(zé)定時(shí)默認(rèn)1小時(shí)扎即,從namenode上吞获,獲取fsimage和edits來進(jìn)行合并,然后再發(fā)送給namenode谚鄙。減少namenode的工作量
NameNode(NN)各拷、SencondryNameNode(SNN)、DataNode(Dn)介紹
- *NameNode(NN)
- 接受客戶端的讀寫服務(wù)
- 保存metadata的信息闷营,包括:文件的owership和permissions烤黍、文件包含哪些block、block保存在哪些DataNode節(jié)點(diǎn)上(在啟動(dòng)時(shí)由DataNode上報(bào))
- NameNode的metadata信息會(huì)在啟動(dòng)后加載到內(nèi)存中
a. metadata信息在磁盤上的存儲(chǔ)文件為fsimage
b.Block的位置信息不保存在fsimage中(由DataNode上報(bào))
c.edits中保存對(duì)metadata的操作日志
-
SecondryNameNode(SNN)
- 它不是NN的備份(但可以做NN的部分備份工作)傻盟,它的主要工作是幫助NN合并edits log速蕊,減少NN的啟動(dòng)時(shí)間
- SNN合并時(shí)機(jī)
a.根據(jù)配置文件設(shè)置的時(shí)間間隔fs.checkpoint.period
默認(rèn)是3600秒
b.根據(jù)配置文件設(shè)置的edits log的大小fs.checkpoint.size
默認(rèn)的edits log大小為64MB
-
SNN合并流程
a. NN創(chuàng)建一個(gè)新的edits log來接替老的edits的工作
b. NN將fsimage和舊的edits拷貝到SNN上
c. SNN上進(jìn)行合并操作,產(chǎn)生一個(gè)新的fsimage
d. 將新的fsimage復(fù)制一份到NN上
f. 使用新的fsimage和新的edits log -
DataNode(DN)
- 存儲(chǔ)數(shù)塊(block)
- 啟動(dòng)DN線程時(shí)娘赴,DN會(huì)自動(dòng)想NN匯報(bào)Block的信息
- NN向DN發(fā)送心跳檢測(cè)规哲,與其DN保持聯(lián)系(3秒一次),如果NN連續(xù)10分鐘沒有收到DN的心跳诽表,則認(rèn)為該DN已經(jīng)lost媳叨,并從其他DN中備份一份該DN上的所有Block
- block的放置策略
- 第一個(gè)副本腥光,放置在上傳文件的DN上,如果是集群外提交糊秆,則隨便選擇一臺(tái)磁盤、內(nèi)存议双、CPU不太忙的節(jié)點(diǎn)存儲(chǔ)
- 第二個(gè)副本痘番,放置在與第一個(gè)副本不同機(jī)架上的節(jié)點(diǎn)上
- 第三個(gè)副本,放置在與第二個(gè)副本相同機(jī)架上的相鄰節(jié)點(diǎn)上
- 更多副本隨機(jī)放置
HDFS寫入流程
原理
- NameNode具有RackAware機(jī)架感知功能平痰,可以配置
- 若client為DataNode節(jié)點(diǎn)汞舱,那存儲(chǔ)block時(shí),規(guī)則為:副本1宗雇,同client的節(jié)點(diǎn)上昂芜;副本2,不同機(jī)架節(jié)點(diǎn)上赔蒲;副本3泌神,同第二個(gè)副本機(jī)架的另一個(gè)節(jié)點(diǎn)上;其他副本隨機(jī)挑選
- 若client不為DataNode節(jié)點(diǎn)舞虱,那存儲(chǔ)block時(shí)欢际,規(guī)則為:副本1,隨機(jī)選擇一個(gè)節(jié)點(diǎn)上矾兜;副本2损趋,不同副本1機(jī)架上;副本3椅寺,同副本2相同的另一個(gè)節(jié)點(diǎn)上浑槽;其他副本隨機(jī)挑選
- client想DataNode發(fā)送Block1;發(fā)送過程以流式寫入
HDFS的讀取流程
- client向NameNode發(fā)送讀請(qǐng)求
- NameNode查看Metadata信息,返回文件的block的位置
block1 = 1返帕,5桐玻,6
block2 = 8,1溉旋,2
block3 = 5畸冲,8,9 - block的位置是有先后順序的观腊,先讀block1邑闲,再讀block2、block3梧油。而且block1去node1上讀取苫耸,然后block2去node8上讀取,block3去node5上讀取
副本選擇
為了降低整體的帶寬消耗和讀取延時(shí)儡陨,HDFS會(huì)盡量讓讀取程序讀取離它最近的副本褪子。如果在讀取程序的同一個(gè)機(jī)架上有一個(gè)副本量淌,那么就讀取該副本。如果一個(gè)HDFS集群跨越多個(gè)數(shù)據(jù)中心嫌褪,那么客戶端也將首先讀本地?cái)?shù)據(jù)中心的副本
安全模式
Namenode啟動(dòng)后會(huì)進(jìn)入一個(gè)稱為安全模式的特殊狀態(tài)呀枢。處于安全模式的Namenode是不會(huì)進(jìn)行數(shù)據(jù)塊的復(fù)制的。Namenode從所有的 Datanode接收心跳信號(hào)和塊狀態(tài)報(bào)告笼痛。塊狀態(tài)報(bào)告包括了某個(gè)Datanode所有的數(shù)據(jù)塊列表裙秋。每個(gè)數(shù)據(jù)塊都有一個(gè)指定的最小副本數(shù)。當(dāng)Namenode檢測(cè)確認(rèn)某個(gè)數(shù)據(jù)塊的副本數(shù)目達(dá)到這個(gè)最小值缨伊,那么該數(shù)據(jù)塊就會(huì)被認(rèn)為是副本安全(safely replicated)的摘刑;在一定百分比(這個(gè)參數(shù)可配置)的數(shù)據(jù)塊被Namenode檢測(cè)確認(rèn)是安全之后(加上一個(gè)額外的30秒等待時(shí)間),Namenode將退出安全模式狀態(tài)刻坊。接下來它會(huì)確定還有哪些數(shù)據(jù)塊的副本沒有達(dá)到指定數(shù)目枷恕,并將這些數(shù)據(jù)塊復(fù)制到其他Datanode上
通信協(xié)議
所有的HDFS通訊協(xié)議都是建立在TCP/IP協(xié)議之上√放撸客戶端通過一個(gè)可配置的TCP端口連接到Namenode徐块,通過ClientProtocol協(xié)議與Namenode交互。而Datanode使用DatanodeProtocol協(xié)議與Namenode交互漏益。一個(gè)遠(yuǎn)程過程調(diào)用(RPC)模型被抽象出來封裝ClientProtocol和Datanodeprotocol協(xié)議蛹锰。在設(shè)計(jì)上,Namenode不會(huì)主動(dòng)發(fā)起RPC绰疤,而是響應(yīng)來自客戶端或 Datanode 的RPC請(qǐng)求