Hadoop 的組成
- HDFS
管理者:namenode
工作者:DataNode
輔助管理者:secondaryNameNode - MapReduce
- YARN
管理者:ResourceManage
工作者:NodeManage
HDFS 分布式存儲(chǔ)工作機(jī)制
HDFS是一個(gè)文件存存儲(chǔ)系統(tǒng),他的meta信息以及目錄結(jié)構(gòu)是存儲(chǔ)在NameNode中的,文件是以block的形式存儲(chǔ)在DataNode中,通過(guò)與NameNode交互,可以實(shí)現(xiàn)讀寫(xiě)的操作
讀操作
- 客戶端會(huì)先帶著讀取路徑向NameNode發(fā)送讀取請(qǐng)求
- NameNode接收到請(qǐng)求后,會(huì)先判斷是否有權(quán)限,讀取文件是否存在等等,如果都無(wú)誤則將文件所在的DataNode的節(jié)點(diǎn)位置,發(fā)送給客戶端部分或者全部的DataNode的節(jié)點(diǎn)位置
- 客戶端得到文件塊存儲(chǔ)的位置后,會(huì)調(diào)用read()方法,去讀取數(shù)據(jù)
- 在讀取之前會(huì)先進(jìn)行一個(gè)checksum的操作,去判斷一下校驗(yàn)和是否正確,正確則讀,不正確則去下一個(gè)存放該block塊的DataNode節(jié)點(diǎn)上讀取
- 讀取完NameNode這次發(fā)送過(guò)來(lái)的所有的block塊后,會(huì)再去詢問(wèn)是否還有block塊,如果有則接著讀取,如果沒(méi)有則調(diào)用close方法,將讀取到的文件合并成一個(gè)大文件
寫(xiě)操作
- 客戶端會(huì)帶著文件路徑向NameNode發(fā)送寫(xiě)入請(qǐng)求
- NameNode會(huì)去判斷是否有權(quán)限,寫(xiě)入路徑的父級(jí)目錄是否存在,如都無(wú)誤則發(fā)送可以寫(xiě)入的請(qǐng)求返回給客戶端
- 客戶端會(huì)將文件進(jìn)行切分,然后上傳block
- NameNode會(huì)根據(jù)DataNode的存儲(chǔ)空間還有機(jī)架感知原理等返回該block塊將要存儲(chǔ)的DataNode的位置 ABC
- 客戶端會(huì)去ABC三個(gè)DataNode節(jié)點(diǎn)上建立pipeline A-B B-C然后C建立完成后會(huì)將結(jié)果返回給B B返回給A A返回給客戶端
- 開(kāi)始往A寫(xiě)入 依次進(jìn)行流水線的復(fù)制
- 寫(xiě)入完后再去依次寫(xiě)入其他block塊
- 都寫(xiě)入完成后會(huì)將寫(xiě)入完成的信息返回給NameNode
- NameNode存儲(chǔ)該文件的各個(gè)block塊的元數(shù)據(jù)信息
Hadoop HA的架構(gòu)原理
- 在兩個(gè)節(jié)點(diǎn)上都安裝一個(gè)NameNode
- 每個(gè)NameNode所在的節(jié)點(diǎn)中都有一個(gè)監(jiān)控器
- 監(jiān)控器會(huì)監(jiān)控NameNode的狀態(tài),并在zk中注冊(cè)節(jié)點(diǎn)
- 兩個(gè)NameNode誰(shuí)先在zk中注冊(cè)成功則誰(shuí)就是active狀態(tài),剩下的那個(gè)則是standby
- 如果active節(jié)點(diǎn)掛掉了,監(jiān)控器則將zk中注冊(cè)的節(jié)點(diǎn)注銷(xiāo)掉
- standby中的監(jiān)控器一旦檢測(cè)到zk中的節(jié)點(diǎn)消失,則立即注冊(cè)并通知standby狀態(tài)的NameNode開(kāi)始工作,standby會(huì)先去遠(yuǎn)程執(zhí)行kill -9 activeNameNode節(jié)點(diǎn)的端口 殺死他后 開(kāi)始切換到active狀態(tài)開(kāi)始工作
- activeNameNode和standbyNameNode是使用JN進(jìn)行做主從復(fù)制的
YARN的資源調(diào)度工作機(jī)制
- 客戶端向RM提交作業(yè)
- RM會(huì)去NM中開(kāi)啟一個(gè)container容器用來(lái)運(yùn)行AM
- AM會(huì)向RM注冊(cè)自己
- AM向RM申請(qǐng)響應(yīng)數(shù)量的Container用來(lái)運(yùn)行task任務(wù)
- Container會(huì)先進(jìn)行一個(gè)初始化的工作,初始化完成AM會(huì)通知對(duì)應(yīng)的NM開(kāi)啟container
- NM開(kāi)啟container
- container在運(yùn)行期間會(huì)向AM匯報(bào)自己的進(jìn)度,狀態(tài)等信息,并與AM保持心跳
- 等待應(yīng)用執(zhí)行完畢,AM向RM注銷(xiāo)自己,并允許RM收回資源