HDFS的架構(gòu)及寫入流程。
HDFS是Hadoop的組件之一,是一個分布式文件系統(tǒng), 文件系統(tǒng)是一個抽象類,其中有很多的子實現(xiàn)類,例如:hdfs,file:\(本地磁盤),ftp文件系統(tǒng),webHdfs(可通過瀏覽器的界面進行文件操作).

1架構(gòu)圖
(1)HDFSClient:客戶端想要請求數(shù)據(jù),首先對NameNode進行"詢問",NameNode會將數(shù)據(jù)的存儲信息返回給用戶.
(2) NameNode :保存HDFS元數(shù)據(jù)的信息(存儲在內(nèi)存中,磁盤),負責(zé)管理文件系統(tǒng)的名字空間(namespace)以及客戶端對文件的訪問.
(3)Secondary NameNode:主機元數(shù)據(jù)的輔助管理
(4) DateNode:存儲數(shù)據(jù)
(5) Heartbeats: NameNode和DateNode之間存在心跳機制.DateNode會定期向NameNode報告自己是否還"活著".NameNode全權(quán)管理數(shù)據(jù)庫的復(fù)制,它周期性的從集群中的每個DataNode接收心跳信合和狀態(tài)報告,接收到心跳信號意味著DataNode節(jié)點工作正常,塊狀態(tài)報告包含了一個該DataNode上所有的數(shù)據(jù)列表.
(6) Blancing:負載均衡
(7) Replication:副本機制,副本存放在哪些Datanode上由NameNode來控制,根據(jù)全局情況作出塊放置決定,讀取文件時NameNode盡量讓用戶先讀取最近的副本,降低讀取網(wǎng)絡(luò)開銷和讀取延時.默認(rèn)設(shè)置3個副本
2.HDFS的block塊存儲
HDFS數(shù)據(jù)塊:HDFS上的文件被劃分為塊大小的多個分塊,作為獨立的 存儲單元,稱為數(shù)據(jù)塊,在hadoop1當(dāng)中,文件的block塊默認(rèn)大小是64M,hadoop2當(dāng)中,文件的block塊大小默認(rèn)是128M,block塊的大小可以通過hdfs-site.xml當(dāng)中的配置文件進行指定.
2.1 抽象塊好處:
(1)一個文件的大小可以大于集群任意節(jié)點磁盤的容量
(2)容易對數(shù)據(jù)進行備份,提高容錯能力
(3)使用抽象塊概念而非整個文件作為存儲單元,大大簡化存儲子系統(tǒng)的設(shè)計
2.2 塊緩存
將block塊存儲到內(nèi)存中,在執(zhí)行一些MR計算時,可以從內(nèi)存中獲取,比較快,比較使用于小表join大表的情況.
3.HDFS的元數(shù)據(jù)信息管理
當(dāng)namenode就一個的時候,所有的元數(shù)據(jù)信息都保存在了FsImage與Eidts文件當(dāng)中,這兩個文件就記錄了所有的數(shù)據(jù)的元數(shù)據(jù)信息,元數(shù)據(jù)信息的保存目錄配置在了hdfs-site.xml當(dāng)中.
3.1 介紹
(1) FsImage:是namenode中關(guān)于元數(shù)據(jù)的鏡像,一般稱為檢查點。存放的是一份完整的元數(shù)據(jù)信息,內(nèi)容較大.
(2) Edits:元數(shù)據(jù)操作日志,記錄了一段時間的元數(shù)據(jù)信息變化情況. 隨著edits內(nèi)容增大,就需要在一定時間點和fsimage合并。
(3) SecondaryNameNode:主要職責(zé)合并edits和fsImage,清空edits.
3.2 edits和fsImage合并的控制策略:
SecondaryNameNode定期檢查edits文件,一旦觸發(fā)合并條件(時間長短(fs.checkpoint.period: 默認(rèn)是一個小時(3600s))+文件大小(fs.checkpoint.size: 默認(rèn)64MB))
1)secondaryNameNode通知NameNode準(zhǔn)備切換edits文件.
2)NameNode接收到切換通知,所有的操作通知寫入到新的edits文件中.
3)secondaryNameNode獲取edits和fsImage兩個文件,一次性將兩個文件加載到內(nèi)存中,合并成為新的fsImage.
4)secondaryNameNode將新的fsImage發(fā)送給NameNode替換掉原有舊的fsImage.
4.HDFS文件寫入
詳細步驟:
1、 client發(fā)起文件上傳請求,通過RPC與NameNode建立通訊,NameNode檢查目標(biāo)文件是否已存在,父目錄是否存在,返回是否可以上傳;
2、 client請求第一個block該傳輸?shù)侥男〥ataNode服務(wù)器上;
3、 NameNode根據(jù)配置文件中指定的備份數(shù)量及機架感知原理進行文件分配,返回可用的DataNode的地址如:A,B,C;
注:Hadoop在設(shè)計時考慮到數(shù)據(jù)的安全與高效,數(shù)據(jù)文件默認(rèn)在HDFS上存放三份,存儲策略為本地一份,同機架內(nèi)其它某一節(jié)點上一份,不同機架的某一節(jié)點上一份。
4、 client請求3臺DataNode中的一臺A上傳數(shù)據(jù)(本質(zhì)上是一個RPC調(diào)用,建立pipeline),A收到請求會繼續(xù)調(diào)用B,然后B調(diào)用C,將整個pipeline建立完成,后逐級返回client;
5、 client開始往A上傳第一個block(先從磁盤讀取數(shù)據(jù)放到一個本地內(nèi)存緩存),以packet為單位(默認(rèn)64K),A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應(yīng)答隊列等待應(yīng)答。
6、 數(shù)據(jù)被分割成一個個packet數(shù)據(jù)包在pipeline上依次傳輸,在pipeline反方向上,逐個發(fā)送ack(命令正確應(yīng)答),最終由pipeline中第一個DataNode節(jié)點A將pipelineack發(fā)送給client;
7、 當(dāng)一個block傳輸完成之后,client再次請求NameNode上傳第二個block到服務(wù)器。
5.HDFS文件讀取
讀取時可以通過多線程的方式去讀取block塊,提高讀取的效率.
詳細步驟:
1、 Client向NameNode發(fā)起RPC請求,來確定請求文件block所在的位置;
2、 NameNode會視情況返回文件的部分或者全部block列表,對于每個block,NameNode 都會返回含有該 block 副本的 DataNode 地址; 這些返回的 DN 地址,會按照集群拓撲結(jié)構(gòu)得出 DataNode 與客戶端的距離,然后進行排序,排序兩個規(guī)則:網(wǎng)絡(luò)拓撲結(jié)構(gòu)中距離 Client 近的排靠前;心跳機制中超時匯報的 DN 狀態(tài)為 STALE,這樣的排靠后;
3、 Client 選取排序靠前的 DataNode 來讀取 block,如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù)(短路讀取特性);
4、 底層上本質(zhì)是建立 Socket Stream(FSDataInputStream),重復(fù)的調(diào)用父類 DataInputStream 的 read 方法,直到這個塊上的數(shù)據(jù)讀取完畢;
5、 當(dāng)讀完列表的 block 后,若文件讀取還沒有結(jié)束,客戶端會繼續(xù)向NameNode 獲取下一批的 block 列表;
6、 讀取完一個 block 都會進行 checksum 驗證,如果讀取 DataNode 時出現(xiàn)錯誤,客戶端會通知 NameNode,然后再從下一個擁有該 block 副本的DataNode 繼續(xù)讀。
7、 read 方法是并行的讀取 block 信息,不是一塊一塊的讀取;NameNode 只是返回Client請求包含塊的DataNode地址,并不是返回請求塊的數(shù)據(jù);
8、 最終讀取來所有的 block 會合并成一個完整的最終文件。
緩存 Hadoop 存儲
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。