前面完成了Hadoop的偽分布式搭建和集群的搭建。為hadoop的學習提供環(huán)境负懦,接下來是對hadoop的hdfs和mapreduce原理進行講述醒叁。
1.hdfs
HDFS是分布式文件系統(tǒng)坯门,當然當前市面上分布式文件系統(tǒng)不止hdfs這么一個返敬。適合一次寫入,多次查詢場景。其特點就是容錯性好塔拳,就算系統(tǒng)中某個節(jié)點脫機鼠证,整體來說系統(tǒng)仍然可以持續(xù)運作而不會有數(shù)據(jù)損失。其架構圖如下:
圖片1.jpg
HDFS架構有NameNode靠抑、DataNode量九、secondaryNameNode構成。
(1)NameNode :是整個文件系統(tǒng)的管理街節(jié)點颂碧,維護文件系統(tǒng)的目錄樹荠列。記錄文件/目錄的元數(shù)據(jù)信息以及每個文件對應的數(shù)據(jù)塊列表。也是接受用戶的操作請求稚伍。它的文件主要包括:
fsimage:元數(shù)據(jù)鏡像文件弯予,存儲namenode某一段時間內(nèi),元數(shù)據(jù)存儲信息个曙。
edits:操作日志信息。記錄操作信息受楼。
fstime:記錄最近一次checkpoint時間垦搬。
以上文件在linux中都是可以看到的。具體位置跟hdfs-site.xml中艳汽,dfs.name.dir配置的路徑下猴贰。如圖,我自己的配置為:
2.PNG
當客戶端請求到達namenode時候河狐,在namenode中將元數(shù)據(jù)存儲米绕。元數(shù)據(jù)存儲細節(jié)如下圖:
3.PNG
NameNode的工作特點:
第一:namenode始終在內(nèi)存中保存metedata,用于處理“讀”請求馋艺。
第二:當有“寫”請求時候栅干,namenode首先會向edits日志,成功返回后捐祠,修改內(nèi)存碱鳞。并且向客戶端返回。
第三:namenode會維護一個fsimage文件踱蛀,也就是metedata的鏡像文件窿给。在偽分布式中,fsimage不會隨時和內(nèi)存中metadata數(shù)據(jù)保持一致率拒,會每隔一定時間進行合并edits文件來更新內(nèi)容崩泡。secondrynamenode就是用來合并fsimage和edits文件來更新namenode的metedata的。當然數(shù)據(jù)合并的標準(checkpoint)為:時間的長短和edits文件的大小猬膨。也是fs.checkpoint.period和fs.checkpoint.size
(2)secondryName
secondryname是HA的一個解決方案角撞,直接配置即可,工具流程就是從namenode下載fsimage和edits,合并成新的fsimage在本地保存并推送到NameNode替換舊的fsimage靴寂。默認安裝在NameNode上磷蜀,但是這樣會是不安全的。
secondryName工作流程百炬,secondryname通知namenode切換edits文件褐隆,然后從nameNode下載edits和fsimage文件,將fsimage加載到內(nèi)存中剖踊,并開始合成edits文件庶弃,將新合成文件 發(fā)送給nameNode,替換舊的fsimage文件德澈。如下圖:
image.png
(3)DataNode
datanode是真是存儲數(shù)據(jù)地方歇攻,Hdfs默認文件快的大小為128m。replication備份數(shù)量為3份梆造。
(4)HDFS的讀取過程
1.初始化FileSystem缴守,然后客戶端(client)用FileSystem的open()函數(shù)打開文件
2.FileSystem用RPC調用元數(shù)據(jù)節(jié)點,得到文件的數(shù)據(jù)塊信息镇辉,對于每一個數(shù)據(jù)塊屡穗,元數(shù)據(jù)節(jié)點返回保存數(shù)據(jù)塊的數(shù)據(jù)節(jié)點的地址。
3.FileSystem返回FSDataInputStream給客戶端忽肛,用來讀取數(shù)據(jù)村砂,客戶端調用stream的read()函數(shù)開始讀取數(shù)據(jù)。
4.DFSInputStream連接保存此文件第一個數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點屹逛,data從數(shù)據(jù)節(jié)點讀到客戶端(client)
5.當此數(shù)據(jù)塊讀取完畢時础废,DFSInputStream關閉和此數(shù)據(jù)節(jié)點的連接,然后連接此文件下一個數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點罕模。
6.當客戶端讀取完畢數(shù)據(jù)的時候评腺,調用FSDataInputStream的close函數(shù)。
7.在讀取數(shù)據(jù)的過程中手销,如果客戶端在與數(shù)據(jù)節(jié)點通信出現(xiàn)錯誤歇僧,則嘗試連接包含此數(shù)據(jù)塊的下一個數(shù)據(jù)節(jié)點。
8.失敗的數(shù)據(jù)節(jié)點將被記錄锋拖,以后不再連接诈悍。
image.png
(5)HdFS寫的過程
1.初始化FileSystem,客戶端調用create()來創(chuàng)建文件
2.FileSystem用RPC調用元數(shù)據(jù)節(jié)點兽埃,在文件系統(tǒng)的命名空間中創(chuàng)建一個新的文件侥钳,元數(shù)據(jù)節(jié)點首先確定文件原來不存在,并且客戶端有創(chuàng)建文件的權限柄错,然后創(chuàng)建新文件舷夺。
3.FileSystem返回DFSOutputStream苦酱,客戶端用于寫數(shù)據(jù),客戶端開始寫入數(shù)據(jù)给猾。
4.DFSOutputStream將數(shù)據(jù)分成塊疫萤,寫入data queue。data queue由Data Streamer讀取敢伸,并通知元數(shù)據(jù)節(jié)點分配數(shù)據(jù)節(jié)點扯饶,用來存儲數(shù)據(jù)塊(每塊默認復制3塊)。分配的數(shù)據(jù)節(jié)點放在一個pipeline里池颈。Data Streamer將數(shù)據(jù)塊寫入pipeline中的第一個數(shù)據(jù)節(jié)點尾序。第一個數(shù)據(jù)節(jié)點將數(shù)據(jù)塊發(fā)送給第二個數(shù)據(jù)節(jié)點。第二個數(shù)據(jù)節(jié)點將數(shù)據(jù)發(fā)送給第三個數(shù)據(jù)節(jié)點躯砰。
5.DFSOutputStream為發(fā)出去的數(shù)據(jù)塊保存了ack queue每币,等待pipeline中的數(shù)據(jù)節(jié)點告知數(shù)據(jù)已經(jīng)寫入成功。
6.當客戶端結束寫入數(shù)據(jù)琢歇,則調用stream的close函數(shù)兰怠。此操作將所有的數(shù)據(jù)塊寫入pipeline中的數(shù)據(jù)節(jié)點,并等待ack queue返回成功矿微。最后通知元數(shù)據(jù)節(jié)點寫入完畢痕慢。
7.如果數(shù)據(jù)節(jié)點在寫入的過程中失敗,關閉pipeline涌矢,將ack queue中的數(shù)據(jù)塊放入data queue的開始,當前的數(shù)據(jù)塊在已經(jīng)寫入的數(shù)據(jù)節(jié)點中被元數(shù)據(jù)節(jié)點賦予新的標示快骗,則錯誤節(jié)點重啟后能夠察覺其數(shù)據(jù)塊是過時的娜庇,會被刪除。失敗的數(shù)據(jù)節(jié)點從pipeline中移除方篮,另外的數(shù)據(jù)塊則寫入pipeline中的另外兩個數(shù)據(jù)節(jié)點名秀。元數(shù)據(jù)節(jié)點則被通知此數(shù)據(jù)塊是復制塊數(shù)不足,將來會再創(chuàng)建第三份備份藕溅。
image.png