HDFS的工作機(jī)制
概述
- HDFS集群分為兩大角色:NameNode、DataNode
- NameNode負(fù)責(zé)管理整個(gè)文件系統(tǒng)的元數(shù)據(jù)
- DataNode 負(fù)責(zé)管理用戶(hù)的文件數(shù)據(jù)塊
- 文件會(huì)按照固定的大芯┝ (blocksize)切成若干塊后分布式存儲(chǔ)在若干臺(tái)datanode上
- 每一個(gè)文件塊可以有多個(gè)副本锰蓬,并存放在不同的datanode上
- Datanode會(huì)定期向Namenode匯報(bào)自身所保存的文件block信息,而namenode則會(huì)負(fù)責(zé)保持文件的副本數(shù)量
- HDFS的內(nèi)部工作機(jī)制對(duì)客戶(hù)端保持透明幻碱,客戶(hù)端請(qǐng)求訪(fǎng)問(wèn)HDFS都是通過(guò)向namenode申請(qǐng)來(lái)進(jìn)行
HDFS寫(xiě)數(shù)據(jù)流程
概述
客戶(hù)端要向HDFS寫(xiě)數(shù)據(jù),首先要跟namenode通信以確認(rèn)可以寫(xiě)文件并獲得接收文件block的datanode,然后鸭丛,客戶(hù)端按順序?qū)⑽募饌€(gè)block傳遞給相應(yīng)datanode,并由接收到block的datanode負(fù)責(zé)向其他datanode復(fù)制block的副本
詳細(xì)步驟圖
詳細(xì)步驟分析
- 根namenode通信請(qǐng)求上傳文件唐责,namenode檢查目標(biāo)文件是否已存在鳞溉,父目錄是否存在
- namenode返回是否可以上傳
- client請(qǐng)求第一個(gè) block該傳輸?shù)侥男ヾatanode服務(wù)器上
- namenode返回3個(gè)datanode服務(wù)器ABC
- client請(qǐng)求3臺(tái)dn中的一臺(tái)A上傳數(shù)據(jù)(本質(zhì)上是一個(gè)RPC調(diào)用,建立pipeline)鼠哥,A收到請(qǐng)求會(huì)繼續(xù)調(diào)用B熟菲,然后B調(diào)用C,將真?zhèn)€pipeline建立完成朴恳,逐級(jí)返回客戶(hù)端
- client開(kāi)始往A上傳第一個(gè)block(先從磁盤(pán)讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存)抄罕,以packet為單位,A收到一個(gè)packet就會(huì)傳給B于颖,B傳給C贞绵;A每傳一個(gè)packet會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答
- 當(dāng)一個(gè)block傳輸完成之后,client再次請(qǐng)求namenode上傳第二個(gè)block的服務(wù)器恍飘。
HDFS讀數(shù)據(jù)流程
概述
客戶(hù)端將要讀取的文件路徑發(fā)送給namenode榨崩,namenode獲取文件的元信息(主要是block的存放位置信息)返回給客戶(hù)端,客戶(hù)端根據(jù)返回的信息找到相應(yīng)datanode逐個(gè)獲取文件的block并在客戶(hù)端本地進(jìn)行數(shù)據(jù)追加合并從而獲得整個(gè)文件
詳細(xì)步驟圖
詳細(xì)步驟解析
- 跟namenode通信查詢(xún)?cè)獢?shù)據(jù)章母,找到文件塊所在的datanode服務(wù)器
- 挑選一臺(tái)datanode(就近原則母蛛,然后隨機(jī))服務(wù)器,請(qǐng)求建立socket流
- datanode開(kāi)始發(fā)送數(shù)據(jù)(從磁盤(pán)里面讀取數(shù)據(jù)放入流乳怎,以packet為單位來(lái)做校驗(yàn))
- 客戶(hù)端以packet為單位接收彩郊,現(xiàn)在本地緩存,然后寫(xiě)入目標(biāo)文件
NAMENODE工作機(jī)制
NAMENODE職責(zé)
NAMENODE職責(zé):
負(fù)責(zé)客戶(hù)端請(qǐng)求的響應(yīng)
元數(shù)據(jù)的管理(查詢(xún)蚪缀,修改)
元數(shù)據(jù)管理
namenode對(duì)數(shù)據(jù)的管理采用了三種存儲(chǔ)形式:
內(nèi)存元數(shù)據(jù)(NameSystem)
磁盤(pán)元數(shù)據(jù)鏡像文件
數(shù)據(jù)操作日志文件(可通過(guò)日志運(yùn)算出元數(shù)據(jù))
元數(shù)據(jù)存儲(chǔ)機(jī)制
- 內(nèi)存中有一份完整的元數(shù)據(jù)(內(nèi)存meta data)
- 磁盤(pán)有一個(gè)“準(zhǔn)完整”的元數(shù)據(jù)鏡像(fsimage)文件(在namenode的工作目錄中)
- 用于銜接內(nèi)存metadata和持久化元數(shù)據(jù)鏡像fsimage之間的操作日志(edits文件)注:當(dāng)客戶(hù)端對(duì)hdfs中的文件進(jìn)行新增或者修改操作秫逝,操作記錄首先被記入edits日志文件中,當(dāng)客戶(hù)端操作成功后询枚,相應(yīng)的元數(shù)據(jù)會(huì)更新到內(nèi)存meta.data中
元數(shù)據(jù)手動(dòng)查看
可以通過(guò)hdfs的一個(gè)工具來(lái)查看edits中的信息
bin/hdfs oev -i edits -o edits.xml
bin/hdfs oiv -i fsimage_0000000000000000087 -p XML -o fsimage.xml
元數(shù)據(jù)的checkpoint
每隔一段時(shí)間违帆,會(huì)由secondary namenode將namenode上積累的所有edits和一個(gè)最新的fsimage下載到本地,并加載到內(nèi)存進(jìn)行merge(這個(gè)過(guò)程稱(chēng)為checkpoint)
checkpoint的詳細(xì)過(guò)程
過(guò)程解析
- 從SecondaryNameNode節(jié)點(diǎn)通知NameNode進(jìn)行CheckPoint
- NameNode切換出新的日志文件金蜀,以后的日志都寫(xiě)到新的日志文件中刷后。
- 從SecondaryNameNode節(jié)點(diǎn)從節(jié)點(diǎn)下載fsimage文件及舊的日志文件的畴,fsimage文件只有第一次下載,以后只需要傳輸edits日志文件
- SecondaryNameNode節(jié)點(diǎn)將fsimage文件加載到內(nèi)存中尝胆,并將日志文件與fsimage的合并丧裁,然后生成新的fsimage文件。
- 從SecondaryNameNode節(jié)點(diǎn)將新的fsimage文件用傳回NameNode節(jié)點(diǎn)
- NameNode節(jié)點(diǎn)可以將舊的fsimage文件及舊的日志文件切換為新的fsimage和edit日志文件并更新fstime文件含衔,寫(xiě)入此次checkpoint的時(shí)間煎娇。
這樣NameNode中只需要花費(fèi)很少的時(shí)間,始終保持了最新的元數(shù)據(jù)信息贪染,由于有了備份機(jī)制逊桦,即使宕機(jī)后重啟后還是可以恢復(fù)元數(shù)據(jù),但最新的日志可能來(lái)不及同步會(huì)有丟失)
checkpoint配置參數(shù)
配置在hdfs-site.xml文件中
dfs.namenode.checkpoint.check.period=60
#檢查觸發(fā)條件是否滿(mǎn)足的頻率抑进,60秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
以上兩個(gè)參數(shù)做checkpoint操作時(shí)强经,secondary namenode的本地工作目錄
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}
dfs.namenode.checkpoint.max-retries=3
#最大重試次數(shù)
dfs.namenode.checkpoint.period=3600
#兩次checkpoint之間的時(shí)間間隔3600秒
dfs.namenode.checkpoint.txns=1000000
#兩次checkpoint之間最大的操作記錄
checkpoint的附帶作用
namenode和secondary namenode的工作目錄存儲(chǔ)結(jié)構(gòu)完全相同,所以寺渗,當(dāng)namenode故障退出需要重新恢復(fù)時(shí)匿情,可以從secondary namenode的工作目錄中將fsimage拷貝到namenode的工作目錄,以恢復(fù)namenode的元數(shù)據(jù)
DATANODE的工作機(jī)制
概述
Datanode工作職責(zé):
存儲(chǔ)管理用戶(hù)的文件塊數(shù)據(jù)
定期向namenode匯報(bào)自身所持有的block信息(通過(guò)心跳信息上報(bào))
(這點(diǎn)很重要信殊,因?yàn)榫娉疲?dāng)集群中發(fā)生某些block副本失效時(shí),集群如何恢復(fù)block初始副本數(shù)量的問(wèn)題)
datanode進(jìn)程死亡或者網(wǎng)絡(luò)故障造成datanode無(wú)法與namenode通信涡拘,namenode不會(huì)立即把該節(jié)點(diǎn)判定為死亡玲躯,要經(jīng)過(guò)一段時(shí)間,這段時(shí)間暫稱(chēng)作超時(shí)時(shí)長(zhǎng)鳄乏。HDFS默認(rèn)的超時(shí)時(shí)長(zhǎng)為10分鐘+30秒
配置超時(shí)
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>3600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
如果定義超時(shí)時(shí)間為timeout跷车,則超時(shí)時(shí)長(zhǎng)的計(jì)算公式為:
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。
而默認(rèn)的heartbeat.recheck.interval 大小為5分鐘橱野,dfs.heartbeat.interval默認(rèn)為3秒朽缴。
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的單位為毫秒,dfs.heartbeat.interval的單位為秒水援。所以密强,舉個(gè)例子,如果heartbeat.recheck.interval設(shè)置為5000(毫秒)蜗元,dfs.heartbeat.interval設(shè)置為3(秒或渤,默認(rèn)),則總的超時(shí)時(shí)間為40秒奕扣。
<property>
<name>heartbeat.recheck.interval</name>
<value>2000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>1</value>
</property>