在介紹HDFS讀寫流程時诱贿,先介紹下Block副本放置策略。
Block副本放置策略
- 第一個副本:放置在上傳文件的DataNode咕缎;如果是集群外提交珠十,則隨機挑選一臺磁盤不太滿,CPU不太忙的節(jié)點凭豪。
- 第二個副本:放置在與第一個副本不同的機架的節(jié)點上焙蹭。
- 第三個副本:與第二個副本相同機架的節(jié)點。
- 更多副本:隨機節(jié)點嫂伞。
HDFS副本放置策略
HDFS寫流程
HDFS寫流程
- 客戶端發(fā)請求給NameNode孔厉,我想保存一個文件A,這時候在NameNode會有一個標識帖努,標識為A_copy(文件不可用)撰豺。
- 根據(jù)副本放置策略,返回三個副本的可放置位置列表拼余,且默認為sort排好順序的污桦。
- 客戶端主動去和離自己最近的DataNode連接(暫且叫DN1),然后DN1后續(xù)的DN2進行連接,DN2在和DN3進行連接匙监。(串聯(lián)方式Pipeline)
- 客戶端讀取源文件凡橱,對該Block進行更小的切割小作,
- 第一次:傳遞第一個Block中的第一個小包給DN1。
- 第二次:傳遞第一個Block中的第二個小包給DN1稼钩,與此同時顾稀,DN1中的第一個小包傳遞給DN2。
- 第三次:傳遞第一個Block中的第三個小包給DN1坝撑,與此同時础拨,DN1中的第二個小包傳遞給DN2,DN2傳遞第一個小包給DN3.
- 依次類推
(Block切割更小的小包绍载,這里這么設計的好處是時間不重疊。如果不切滔蝉,一次性傳遞例如64M击儡,當傳遞DN1時,等待蝠引,傳遞DN2時阳谍,繼續(xù)等待,傳遞DN3時螃概,還在等矫夯,造成時間浪費。另外的一個好處時吊洼,如果增加節(jié)點训貌,時間影響不大)
- 最后通過DataNode與NameNode心跳,通知是否文件徹底傳遞完畢冒窍,補全NameNode中元數(shù)據(jù)的位置信息递沪。
HDFS讀流程
HDFS讀流程
- 客戶端發(fā)請求給NameNode,NameNode將這個文件的元數(shù)據(jù)找到综液,告知給客戶端(例如文件A款慨,被切割為5個Block,元文件會紀錄Block1:DN1,DN2,DN3,Block2:DN1,DN4,DN5等等依次類推)
- 客戶端直接向DataNode請求Block數(shù)據(jù)(遵循距離優(yōu)先)
- 當把所有的Block下載回本地后,進行驗證每個Block元信息的MD5谬莹。如果每個Block都是正確的檩奠,沒有被破壞,開始進行拼接附帽,最終文件就被還原回來了埠戳。
HDFS文件權限
- 與Linux文件權限類似
- r:read;w:write;x:execute
- 權限x對應文件忽略,對于文件夾表示是否允許訪問其內容
- 如果Linux系統(tǒng)用戶zhangyongli使用Hadoop命名創(chuàng)建一個文件士葫,那么這個文件在HDFS中owner就是zhangyongli
- HDFS的權限目的乞而,阻止好人做錯事,而不是阻止壞人做壞事慢显。HDFS相信爪模,你告訴我你是誰欠啤,我就認為你是誰。
解釋:
- 阻止好人做錯事:例如AB兩個用戶屋灌,A用戶創(chuàng)建了一個X文件洁段,B用戶創(chuàng)建了一個Y文件,B用戶刪除不了A用戶的文件X共郭。
- 阻止壞人做壞事:如果AB兩個用戶中的某個壞人祠丝,裝了一臺全新的linux系統(tǒng),也創(chuàng)建AB用戶除嘹,補全Hadoop部署文件內容写半,客戶端程序,然后用新系統(tǒng)的A向NameNode去刪除X文件尉咕,由于NameNode是被動受信叠蝇,所以未來需要集成kerberos來防止這種操作。
(轉發(fā)請注明出處:http://www.reibang.com/u/829cbce64381 如發(fā)現(xiàn)有錯年缎,請留言悔捶,謝謝)