目錄
- HDFS的工作機(jī)制
- 概述
- HDFS 寫數(shù)據(jù)流程
- HDFS 讀數(shù)據(jù)流程
- NameNode的工作機(jī)制
- NameNode的職責(zé)
- 元數(shù)據(jù)的管理
- DataNode的工作機(jī)制
- 概述
- 觀察驗(yàn)證DataNode 功能
HDFS的工作機(jī)制
工作機(jī)制的學(xué)習(xí)主要是為加深對(duì)分布式系統(tǒng)的理解,以及增強(qiáng)遇到各種問題時(shí)的分析解決能力,形成一定的集群運(yùn)維能力。
很多不是真正理解hadoop技術(shù)體系的人會(huì)常常覺得HDFS可用于網(wǎng)盤類應(yīng)用,但實(shí)際并非如此。要想將技術(shù)準(zhǔn)確用在恰當(dāng)?shù)牡胤剑仨殞?duì)技術(shù)有深刻的理解。
概述
- 1.HDFS集群分為兩大角色:NameNode、DataNode
- 2.NameNode負(fù)責(zé)管理整個(gè)文件系統(tǒng)的元數(shù)據(jù)(元數(shù)據(jù)就是文件數(shù)據(jù)塊放置在DataNode位置和數(shù)量等信息)
- 3.DataNode 負(fù)責(zé)管理用戶的文件數(shù)據(jù)塊
- 4.文件會(huì)按照固定的大小(blocksize)切成若干塊后分布式存儲(chǔ)在若干臺(tái)datanode上
- 5.每一個(gè)文件塊可以有多個(gè)副本,并存放在不同的datanode上
- 6.Datanode會(huì)定期向Namenode匯報(bào)自身所保存的文件block信息,而namenode則會(huì)負(fù)責(zé)保持文件的副本數(shù)量
- 7.HDFS的內(nèi)部工作機(jī)制對(duì)客戶端保持透明,客戶端請(qǐng)求訪問HDFS都是通過向namenode申請(qǐng)來進(jìn)行
HDFS 寫數(shù)據(jù)流程
- 概述
客戶端要向HDFS寫數(shù)據(jù),首先要跟Namenode通信以確認(rèn)可以寫文件并獲得接收文件block的Datanode,然后,客戶端按順序?qū)⑽募饌€(gè)block傳遞給相應(yīng)Datanode,并由接收到block的Datanode負(fù)責(zé)向其他Datanode復(fù)制block的副本
- 寫數(shù)據(jù)步驟詳解
1、Client向Namenode通信請(qǐng)求上傳文件,Namenode檢查目標(biāo)文件是否已存在,父目錄是否存在
2、Namenode返回是否可以上傳
3、Client請(qǐng)求第一個(gè) block該傳輸?shù)侥男〥atanode服務(wù)器上
4、Namenode返回3個(gè)Datanode服務(wù)器ABC
5、Client請(qǐng)求3臺(tái)DataNode中的一臺(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í)返回客戶端
6、Client開始往A上傳第一個(gè)block(先從磁盤讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存),以packet為單位,A收到一個(gè)packet就會(huì)傳給B,B傳給C;A每傳一個(gè)packet會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答
7、當(dāng)一個(gè)block傳輸完成之后,Client再次請(qǐng)求Namenode上傳第二個(gè)block的服務(wù)器。
HDFS 讀數(shù)據(jù)流程
- 概述
客戶端將要讀取的文件路徑發(fā)送給namenode,namenode獲取文件的元信息(主要是block的存放位置信息)返回給客戶端,客戶端根據(jù)返回的信息找到相應(yīng)datanode逐個(gè)獲取文件的block并在客戶端本地進(jìn)行數(shù)據(jù)追加合并從而獲得整個(gè)文件
- 讀數(shù)據(jù)步驟詳解
1、跟namenode通信查詢?cè)獢?shù)據(jù),找到文件塊所在的datanode服務(wù)器
2、挑選一臺(tái)datanode(就近原則,然后隨機(jī))服務(wù)器,請(qǐng)求建立socket流
3、datanode開始發(fā)送數(shù)據(jù)(從磁盤里面讀取數(shù)據(jù)放入流,以packet為單位來做校驗(yàn))
4、客戶端以packet為單位接收,現(xiàn)在本地緩存,然后寫入目標(biāo)文件
NAMENODE工作機(jī)制
NAMENODE職責(zé)
負(fù)責(zé)客戶端請(qǐng)求的響應(yīng)
元數(shù)據(jù)的管理(查詢,修改)
元數(shù)據(jù)管理
namenode對(duì)數(shù)據(jù)的管理采用了三種存儲(chǔ)形式:內(nèi)存元數(shù)據(jù)(NameSystem)
磁盤元數(shù)據(jù)鏡像文件
數(shù)據(jù)操作日志文件(可通過日志運(yùn)算出元數(shù)據(jù))
元數(shù)據(jù)存儲(chǔ)機(jī)制
A、內(nèi)存中有一份完整的元數(shù)據(jù)(內(nèi)存meta data)
B、磁盤有一個(gè)“準(zhǔn)完整”的元數(shù)據(jù)鏡像(fsimage)文件(在namenode的工作目錄中)
-
C、用于銜接內(nèi)存metadata和持久化元數(shù)據(jù)鏡像fsimage之間的操作日志(edits文件)
注:當(dāng)客戶端對(duì)hdfs中的文件進(jìn)行新增或者修改操作,操作記錄首先被記入edits日志文件中,當(dāng)客戶端操作成功后,相應(yīng)的元數(shù)據(jù)會(huì)更新到內(nèi)存meta.data中
元數(shù)據(jù)手動(dòng)查看
可以通過hdfs的一個(gè)工具來查看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è)過程稱為checkpoint)checkpoint的詳細(xì)過程
checkpoint操作的觸發(fā)條件配置參數(shù)
dfs.namenode.checkpoint.check.period=60 #檢查觸發(fā)條件是否滿足的頻率,60秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir} #以上兩個(gè)參數(shù)做checkpoint操作時(shí),secondary namenode的本地工作目錄
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é):
1、存儲(chǔ)管理用戶的文件塊數(shù)據(jù)
2、定期向namenode匯報(bào)自身所持有的block信息(通過心跳信息上報(bào))(這點(diǎn)很重要,因?yàn)椋?dāng)集群中發(fā)生某些block副本失效時(shí),集群如何恢復(fù)block初始副本數(shù)量的問題)<property> <name>dfs.blockreport.intervalMsec</name> <value>3600000</value> <description>Determines block reporting interval in milliseconds. </description> </property>
-
Datanode掉線判斷時(shí)限參數(shù)
datanode進(jìn)程死亡或者網(wǎng)絡(luò)故障造成datanode無法與namenode通信,namenode不會(huì)立即把該節(jié)點(diǎn)判定為死亡,要經(jīng)過一段時(shí)間,這段時(shí)間暫稱作超時(shí)時(shí)長(zhǎng)。HDFS默認(rèn)的超時(shí)時(shí)長(zhǎng)為10分鐘+30秒。如果定義超時(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>
觀察驗(yàn)證DATANODE功能
上傳一個(gè)文件,觀察文件的block具體的物理存放情況:
在每一臺(tái)datanode機(jī)器上的這個(gè)目錄中能找到文件的切塊:
/home/hadoop/app/hadoop-2.7.3/tmp/dfs/data/current/BP-193442119-192.168.88.3-1432458743457/current/finalized
待續(xù)...