1.hadoop1.x hdfs架構(gòu)圖
2.hadoop2.x hdfs架構(gòu)圖
3.hdfs寫(xiě)流程
客戶端要向HDFS寫(xiě)數(shù)據(jù),首先要跟namenode通信以確認(rèn)可以寫(xiě)文件并獲得接收文件block的datanode睛低,然后,客戶端按順序?qū)⑽募饌€(gè)block傳遞給相應(yīng)datanode,并由接收到block的datanode負(fù)責(zé)向其他datanode復(fù)制block的副本
1、client上傳文件先根namenode通信請(qǐng)求上傳文件挠他,namenode檢查目標(biāo)文件是否已存在,父目錄是否存在
2篡帕、namenode返回是否可以上傳(已有文件會(huì)報(bào)錯(cuò))
3绩社、client會(huì)先對(duì)文件進(jìn)行切分,比如一個(gè)blok塊128m赂苗,文件有300m就會(huì)被切分成3個(gè)塊,一個(gè)128M贮尉、一個(gè)128M拌滋、一個(gè)44M請(qǐng)求第一個(gè) block該傳輸?shù)侥男ヾatanode服務(wù)器上
4、namenode通過(guò)機(jī)架感知返回client猜谚,可以用的datanode的服務(wù)器
5败砂、client請(qǐng)求一臺(tái)向datanode上傳數(shù)據(jù)(本質(zhì)上是一個(gè)RPC調(diào)用,建立pipeline)魏铅,第一個(gè)datanode收到請(qǐng)求會(huì)繼續(xù)調(diào)用第二個(gè)datanode昌犹,然后第二個(gè)調(diào)用第三個(gè)datanode,將整個(gè)pipeline建立完成览芳,逐級(jí)返回客戶端
6斜姥、client開(kāi)始往A上傳第一個(gè)block(先從磁盤讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存),以packet為單位(一個(gè)packet為64kb)沧竟,當(dāng)然在寫(xiě)入的時(shí)候datanode會(huì)進(jìn)行數(shù)據(jù)校驗(yàn)铸敏,它并不是通過(guò)一個(gè)packet進(jìn)行一次校驗(yàn)而是以chunk為單位進(jìn)行校驗(yàn)(512byte),第一臺(tái)datanode收到一個(gè)packet就會(huì)傳給第二臺(tái)悟泵,第二臺(tái)傳給第三臺(tái)杈笔;第一臺(tái)每傳一個(gè)packet會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答
7、當(dāng)一個(gè)block傳輸完成之后糕非,client再次請(qǐng)求namenode上傳第二個(gè)block的服務(wù)器蒙具。
4.hdfs讀流程
客戶端將要讀取的文件路徑發(fā)送給namenode,namenode獲取文件的元信息(主要是block的存放位置信息)返回給客戶端朽肥,客戶端根據(jù)返回的信息找到相應(yīng)datanode逐個(gè)獲取文件的block并在客戶端本地進(jìn)行數(shù)據(jù)追加合并從而獲得整個(gè)文件
1禁筏、跟namenode通信查詢?cè)獢?shù)據(jù)(block所在的datanode節(jié)點(diǎn)),找到文件塊所在的datanode服務(wù)器
2鞠呈、挑選一臺(tái)datanode(就近原則融师,然后隨機(jī))服務(wù)器,請(qǐng)求建立socket流
3蚁吝、datanode開(kāi)始發(fā)送數(shù)據(jù)(從磁盤里面讀取數(shù)據(jù)放入流旱爆,以packet為單位來(lái)做校驗(yàn))
4舀射、客戶端以packet為單位接收,先在本地緩存怀伦,然后寫(xiě)入目標(biāo)文件脆烟,后面的block塊就相當(dāng)于是append到前面的block塊最后合成最終需要的文件。