文章目錄
HDFS 簡(jiǎn)介以及架構(gòu)設(shè)計(jì)
詳解SecondaryNameNode
HDFS小文件危害以及解決方案
HDFS 讀流程
HDFS 寫流程
1. HDFS 架構(gòu)設(shè)計(jì)
NameNode(元數(shù)據(jù)節(jié)點(diǎn)):
- 管理文件系統(tǒng)的命名空間
- 設(shè)置副本策略
- 管理數(shù)據(jù)塊的映射信息
- 處理客戶端的c讀寫請(qǐng)求***
DataNode(數(shù)據(jù)節(jié)點(diǎn)):DataNode 是真正存儲(chǔ)數(shù)據(jù)的地方。
- Client 或者 NameNode 可以向 DataNode 請(qǐng)求寫入或者讀出數(shù)據(jù)塊。
- 定時(shí)向 NameNode 匯報(bào)存儲(chǔ)數(shù)據(jù)塊信息贯被。
Secondary NameNode(從元數(shù)據(jù)節(jié)點(diǎn)):它并不是備用的 NameNode 節(jié)點(diǎn)噪窘,它負(fù)責(zé)不同的事。
1.它會(huì)周期性地將 NameNode 的 FSimage 和 Edits 合并泞遗,以防日志文件過大惰许。
- 合并之后的 FSimage 會(huì)在 Secondary NameNode 中保存一份,防止 NameNode 節(jié)點(diǎn)失敗時(shí)可以恢復(fù)
詳解SecondaryNameNode
作用
定期合并NN節(jié)點(diǎn)的fsimage(快照)+editlog(操作日志)為新的fsimage,推送給NN史辙。而觸發(fā)這個(gè)操作的稱為檢查點(diǎn)checkpoint汹买。影響checkpoint主要是兩個(gè)參數(shù):
checkpoint之間的時(shí)間間隔 dfs.namenode.checkpoint.period=3600秒=1小時(shí)
操作事務(wù)數(shù) dfs.namenode.checkpoint.txns=1000000
以上兩個(gè)參數(shù)滿足其一就觸發(fā)SNN的合并操作。
合并流程
1.SecondaryNameNode 通過周期性(五分鐘)聊倔,通過 getEditLog 獲取 editlog 大小晦毙,當(dāng)其 達(dá)到合并的大小時(shí)通過 RollEditLog 方法進(jìn)行合并。
- NameNode 停止使用 edits 文件耙蔑,并生成一個(gè)新的臨時(shí)的 Edits.new 文件见妒。
- SecondaryNameNode 通過 NameNode 內(nèi)建的 Http 服務(wù)器,以 get 的方式獲取 edits 與fsimage 文件甸陌。Get 方法中攜帶著 Fsimage 與 Edits 的路徑须揣。
- SecondaryNameNode 將 Fsimage 載入內(nèi)存并逐一執(zhí)行 Edits 中的操作,生成新的 Fsimage 文件邀层。
- 執(zhí)行結(jié)束后返敬,會(huì)向NameNode發(fā)送 http 請(qǐng)求,告知 NameNode 合并結(jié)束寥院,NameNode 通過 http post 的方式獲取新 fsimage 文件
- Namenode 更新 fsimage 文件中記錄檢查點(diǎn)執(zhí)行的時(shí)間劲赠,并改名為 fsimage 文件。
- Edit.new 文件更名為 edit 文件
2 . HDFS小文件危害以及解決方案
小文件危害
先說對(duì)小文件的定義,一般來說小于等于30M的文件凛澎,都叫小文件霹肝。在HDFS中,通常NN維護(hù)一個(gè)文件的名稱塑煎,目錄結(jié)構(gòu)等大約是250字節(jié)∧唬現(xiàn)實(shí)中,HDFS的小文件如果不做任何操作增長(zhǎng)會(huì)很快最铁,現(xiàn)在假設(shè)NN節(jié)點(diǎn)的內(nèi)存為4G讯赏,差不多42億字節(jié),現(xiàn)在在HDFS上有一億個(gè)小文件冷尉,那么需要250乘一億大約是250億字節(jié)漱挎,這樣會(huì)將NN撐爆。小文件到達(dá)一定數(shù)目雀哨,就會(huì)將NN節(jié)點(diǎn)撐爆磕谅。就算NN能夠存儲(chǔ),對(duì)于hive雾棺,spark計(jì)算時(shí)膊夹,小文件意味著需要更多的task和資源,同樣也會(huì)將節(jié)點(diǎn)弄掛掉捌浩。
解決方案
生產(chǎn)上首先需要設(shè)置小文件的閾值放刨,到達(dá)這個(gè)值對(duì)小文件進(jìn)行合并。對(duì)于這個(gè)合并嘉栓,一種是在HDFS存儲(chǔ)之前就進(jìn)行合并宏榕,還有一種就是計(jì)算完之后根據(jù)業(yè)務(wù)周期來進(jìn)行合并。后一種需要在計(jì)算時(shí)格外對(duì)小文件進(jìn)行調(diào)整侵佃,具體的會(huì)額外出文章講麻昼。
3. HDFS 讀流程
- client使用FileSystem.open(filepath)來rpc調(diào)用NN,NN接受到請(qǐng)求會(huì)進(jìn)行權(quán)限等一系列check
- 如果都o(jì)k馋辈,就會(huì)返回該文件全部或部分block列表(也就是FSInputStream)抚芦,如果過不了check直接拋出異常。
- client調(diào)用FSInputStream的read()去找到離最近的DN讀取block數(shù)據(jù)迈螟,在讀取之后會(huì)check叉抡。如果失敗會(huì)記錄該DN和這個(gè)副本信息,下次不會(huì)在這個(gè)DN讀取答毫,如果沒問題就繼續(xù)讀取下一個(gè)最近的block褥民。當(dāng)全部block列表讀取完之后該文件還沒結(jié)束跳纳,那么filesystem會(huì)繼續(xù)向NN獲取下一批block列表北专。
- 當(dāng)客戶端讀取完畢數(shù)據(jù)的時(shí)候笛匙,調(diào)用FSDataInputStream的close函數(shù)。
4. HDFS 寫流程
- client調(diào)用FileSysytem.create(filepath)來rpc調(diào)用NN于置。
- NN會(huì)對(duì)這個(gè)filepath進(jìn)行check煮嫌,例如是不是已經(jīng)存在該文件等器净,如果沒通過check就會(huì)返回異常信息尖淘,否則返回FSOutputStream并創(chuàng)建一個(gè)未與block聯(lián)系的路徑。
- client使用FSOutputStream來進(jìn)行block的寫入倡勇,將第一個(gè)塊的第一個(gè)副本寫入DN1,第一個(gè)副本寫完傳輸給第二個(gè)DN2,第二個(gè)副本寫完就傳輸給第三個(gè)DN3逞刷,當(dāng)?shù)贒N3寫完,就返回一個(gè)ack packet給DN2妻熊,DN2就返回ack packet給DN1夸浅,DN1就返回ack packet的FSDataOutputStream對(duì)象,標(biāo)識(shí)第一個(gè)塊的三個(gè)副本都寫完了扔役,余下的塊都是這樣寫入题篷。如果其中有一個(gè)DN出現(xiàn)故障那么數(shù)據(jù)流會(huì)重新調(diào)整,繞過故障DN厅目。
- client寫完數(shù)據(jù)關(guān)閉FSOutputStream。
- 同時(shí)client調(diào)用filesystem的complete通知NN寫入操作已經(jīng)完成法严。