前言
???????? Hadoop到目前為止發(fā)展已經(jīng)有10余年韧涨,版本經(jīng)過無數(shù)次的更新迭代牍戚,目前業(yè)內(nèi)大家把Hadoop大的版本分為Hadoop1.0、Hadoop2.0虑粥、Hadoop3.0 三個版本如孝。
一、Hadoop 簡介
???????? Hadoop版本剛出來的時(shí)候是為了解決兩個問題:一是海量數(shù)據(jù)如何存儲的問題娩贷,一個是海量數(shù)據(jù)如何計(jì)算的問題第晰。Hadoop的核心設(shè)計(jì)就是HDFS和 Mapreduce.HDFS解決了海量數(shù)據(jù)如何存儲的問題
, Mapreduce解決了海量數(shù)據(jù)如何計(jì)算的問題彬祖。HDFS的全稱:Hadoop Distributed File System茁瘦。
二、分布式文件系統(tǒng)
? ? ? ? ?HDFS是一個主從的架構(gòu)储笑、主節(jié)點(diǎn)只有一個NemeNode甜熔。從節(jié)點(diǎn)有多個DataNode。
三突倍、HDFS 架構(gòu)
? ? ? ? 客戶端上傳文件時(shí)假設(shè)文件大小為129M
HDFS默認(rèn)切分的大小為128M
這時(shí)就會產(chǎn)生出2個blk
NameNode去通知DataNode上傳文件(這里有一定的策略)腔稀,我們就假設(shè)就將這幾個文件分別存儲在4個服務(wù)器上。為什們要進(jìn)行分別存儲在赘方,假設(shè)DataNode服務(wù)器有一天突然掛掉了我們是不是還可通過DataNode4或2和3進(jìn)行讀取數(shù)據(jù)烧颖,這樣是不是就防止數(shù)據(jù)丟失。
NameNode
- 管理元數(shù)據(jù)信息(文件目錄樹):文件與Block塊窄陡,Block塊與DataNode主機(jī)關(guān)系
- NameNode為快速響應(yīng)用戶操作炕淮,所以把元數(shù)據(jù)信息加載到內(nèi)存里
DataNode
- 存儲數(shù)據(jù),把上傳的數(shù)據(jù)劃分固定大小文件塊(Block)在
Hadoop2.73之前是64M之后改為了128M
- 為了保證數(shù)據(jù)安全跳夭,每個文件默認(rèn)都是三個副本
SecondaryNamenode???????? 周期性的到NameNode節(jié)點(diǎn)拉取Edtis和fsimage文件涂圆,將這兩個文件加入到內(nèi)存進(jìn)行 然后將這兩個文件加入到內(nèi)存中進(jìn)行合并產(chǎn)生新的fsimage發(fā)送給NameNode们镜。
四、HDFS寫入數(shù)據(jù)流程
- 客戶端會帶著文件路徑向NameNode發(fā)送寫入請求通過 RPC 與 NameNode 建立通訊润歉, NameNode 檢查目標(biāo)文件模狭,返回是否可以上傳;
- Client 請求第一個 block 該傳輸?shù)侥男?DataNode 服務(wù)器上踩衩;
- NameNode 根據(jù)副本數(shù)量和副本放置策略進(jìn)行節(jié)點(diǎn)分配嚼鹉,返回DataNode節(jié)點(diǎn),如:A驱富,B锚赤,C
- Client 請求A節(jié)點(diǎn)建立pipeline管道,A收到請求會繼續(xù)調(diào)用B褐鸥,然后B調(diào)用C线脚,將整個pipeline管道建立完成后,逐級返回消息到Client;
- Client收到A返回的消息之后開始往A上傳第一個block塊叫榕,block塊被切分成64K的packet包不斷的在pepiline管道里傳遞浑侥,從A到B,B到C進(jìn)行復(fù)制存儲
- 當(dāng)一個 block塊 傳輸完成之后晰绎,Client 再次請求 NameNode 上傳第二個block塊的存儲節(jié)點(diǎn)寓落,不斷往復(fù)存儲
- 當(dāng)所有block塊傳輸完成之后,Client調(diào)用FSDataOutputSteam的close方法關(guān)閉輸出流荞下,最后調(diào)用FileSystem的complete方法告知NameNode數(shù)據(jù)寫入成功
五零如、HDFS讀取數(shù)據(jù)流程
- 客戶端會先帶著讀取路徑向NameNode發(fā)送讀取請求,通過 RPC 與 NameNode 建立通訊,NameNode檢查目標(biāo)文件锄弱,來確定請求文件 block塊的位置信息
- NameNode會視情況返回文件的部分或者全部block塊列表,對于每個block塊祸憋,NameNode 都會返回含有該 block副本的 DataNode 地址
- 這些返回的 DataNode 地址会宪,會按照集群拓?fù)浣Y(jié)構(gòu)得出 DataNode 與客戶端的距離,然后進(jìn)行排序蚯窥,排序兩個規(guī)則:網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)中距離 Client 近的排靠前掸鹅;心跳機(jī)制中超時(shí)匯報(bào)的 DN 狀態(tài)為 STALE,這樣的排靠后拦赠;
- Client 選取排序靠前的 DataNode 調(diào)用FSDataInputSteam的read方法來讀取 block塊數(shù)據(jù)巍沙,如果客戶端本身就是DataNode,那么將從本地直接獲取block塊數(shù)據(jù)
- 當(dāng)讀完一批的 block塊后,若文件讀取還沒有結(jié)束荷鼠,客戶端會繼續(xù)向NameNode 獲取下一批的 block 列表句携,繼續(xù)讀取
- 所有block塊讀取完成后,Client調(diào)用FSDataInputStream.close()方法允乐,關(guān)閉輸入流矮嫉,并將讀取來所有的 block塊合并成一個完整的最終文件
六削咆、HDFS缺陷
- 單點(diǎn)問題
- 內(nèi)存受限
總結(jié)
???????? 上述給大家講解了簡單的HDFS架構(gòu),我在最后面留了一個小問題蠢笋,我會在下期通過畫圖的方式給大家講解拨齐,我在這里為大家提供大數(shù)據(jù)的資料
需要的朋友可以去下面GitHub去下載,信自己昨寞,努力和汗水總會能得到回報(bào)的瞻惋。我是大數(shù)據(jù)老哥,我們下期見~~~
資源獲取 獲取Flink面試題援岩,Spark面試題歼狼,程序員必備軟件,hive面試題窄俏,Hadoop面試題蹂匹,Docker面試題,簡歷模板等資源請去GitHub自行下載 https://github.com/lhh2002/Framework-Of-BigDataGitee 自行下載 ?https://gitee.com/li_hey_hey/dashboard/projects