更新時(shí)間:2020-12-01 來(lái)源:黑馬程序員 瀏覽量:
Client(客戶端)對(duì)HDFS中的數(shù)據(jù)進(jìn)行讀寫操作,分別是Client從HDFS中查找數(shù)據(jù),即為Read(讀)數(shù)據(jù);Client從HDFS中存儲(chǔ)數(shù)據(jù),即為Write(寫)數(shù)據(jù)。下面我們對(duì)HDFS的讀寫流程進(jìn)行詳細(xì)的介紹。假設(shè)有一個(gè)文件1.txt文件,大小為300M,這樣就劃分出3個(gè)數(shù)據(jù)塊,如圖1所示。
圖1 文件劃分情況
下面,我們借助圖1所示的文件,分別講解HDFS文件讀數(shù)據(jù)和寫數(shù)據(jù)的原理。
1.HDFS寫數(shù)據(jù)原理
在我們把文件上傳到HDFS系統(tǒng)中,HDFS究竟是如何存儲(chǔ)到集群中去的,又是如何創(chuàng)建備份的,接下來(lái)我們來(lái)學(xué)習(xí)客戶端向HDFS中的寫數(shù)據(jù)的流程,如圖2所示。
圖2 HDFS寫數(shù)據(jù)流程
從圖2可以看出,HDFS中的寫數(shù)據(jù)流程可以分為12個(gè)步驟,具體如下:
(1) 客戶端發(fā)起文件上傳請(qǐng)求,通過(guò)RPC(遠(yuǎn)程過(guò)程調(diào)用)與NameNode建立通訊。
(2) NameNode檢查元數(shù)據(jù)文件的系統(tǒng)目錄樹(shù)。
(3) 若系統(tǒng)目錄樹(shù)的父目錄不存在該文件相關(guān)信息,返回客戶端可以上傳文件。
(4) 客戶端請(qǐng)求上傳第一個(gè)Block數(shù)據(jù)塊,以及數(shù)據(jù)塊副本的數(shù)量(可以自定義副本數(shù)量,也可以使用集群規(guī)劃的副本數(shù)量)。
(5) NameNode檢測(cè)元數(shù)據(jù)文件中DataNode信息池,找到可用的數(shù)據(jù)節(jié)點(diǎn)(DataNode_01,DataNode_02,DataNode_03)。
(6) 將可用的數(shù)據(jù)節(jié)點(diǎn)的IP地址返回給客戶端。
(7) 客戶端請(qǐng)求3臺(tái)節(jié)點(diǎn)中的一臺(tái)服務(wù)器DataNode_01,進(jìn)行傳送數(shù)據(jù)(本質(zhì)上是一個(gè)RPC調(diào)用,建立管道Pipeline),DataNode_01收到請(qǐng)求會(huì)繼續(xù)調(diào)用服務(wù)器DataNode_02,然后服務(wù)器DataNode_02調(diào)用服務(wù)器DataNode_03。
(8) DataNode之間建立Pipeline后,逐個(gè)返回建立完畢信息。
(9) 客戶端與DataNode建立數(shù)據(jù)傳輸流,開(kāi)始發(fā)送數(shù)據(jù)包(數(shù)據(jù)是以數(shù)據(jù)包形式進(jìn)行發(fā)送)。
(10) 客戶端向DataNode_01上傳第一個(gè)Block數(shù)據(jù)塊,是以Packet為單位(默認(rèn)64K),發(fā)送數(shù)據(jù)塊。當(dāng)DataNode_01收到一個(gè)Packet就會(huì)傳給DataNode_02,DataNode_02傳給DataNode_03; DataNode_01每傳送一個(gè)Packet都會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答。
(11) 數(shù)據(jù)被分割成一個(gè)個(gè)Packet數(shù)據(jù)包在Pipeline上依次傳輸,而在Pipeline反方向上,將逐個(gè)發(fā)送Ack(命令正確應(yīng)答),最終由Pipeline中第一個(gè)DataNode節(jié)點(diǎn)DataNode_01將Pipeline的 Ack信息發(fā)送給客戶端。
(12) DataNode返回給客戶端,第一個(gè)Block塊傳輸完成??蛻舳藙t會(huì)再次請(qǐng)求NameNode上傳第二個(gè)Block塊和第三塊到服務(wù)器上,重復(fù)上面的步驟,直到3個(gè)Block都上傳完畢。
小提示:
Hadoop在設(shè)計(jì)時(shí)考慮到數(shù)據(jù)的安全與高效,數(shù)據(jù)文件默認(rèn)在HDFS上存放三份,存儲(chǔ)策略為本地一份,同機(jī)架內(nèi)其他某一節(jié)點(diǎn)上一份,不同機(jī)架的某一節(jié)點(diǎn)上一份。
Ack:檢驗(yàn)數(shù)據(jù)完整性的信息。
2.HDFS讀數(shù)據(jù)流程
在前面我們已經(jīng)知道客戶端向HDFS寫數(shù)據(jù)的流程,接下來(lái)我們來(lái)學(xué)習(xí)客戶端從HDFS中讀數(shù)據(jù)的流程,如圖3所示。
圖3 HDFS讀數(shù)據(jù)流程
從圖3可以看出,HDFS中的讀數(shù)據(jù)流程可以分為4個(gè)步驟,具體如下:
(1) 客戶端向NameNode發(fā)起RPC請(qǐng)求,來(lái)獲取請(qǐng)求文件Block數(shù)據(jù)塊所在的位置。
(2) NameNode檢測(cè)元數(shù)據(jù)文件,會(huì)視情況返回Block塊信息或者全部Block塊信息,對(duì)于每個(gè)Block塊,NameNode都會(huì)返回含有該Block副本的DataNode地址。
(3) 客戶端會(huì)選取排序靠前的DataNode來(lái)依次讀取Block塊(如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù)),每一個(gè)Block都會(huì)進(jìn)行CheckSum(完整性驗(yàn)證),若文件不完整,則客戶端會(huì)繼續(xù)向NameNode獲取下一批的Block列表,直到驗(yàn)證讀取出來(lái)文件是完整的,則Block讀取完畢。
(4) 客戶端會(huì)把最終讀取出來(lái)所有的Block塊合并成一個(gè)完整的最終文件(例如:1.txt)。
小提示:
NameNode返回的DataNode地址,會(huì)按照集群拓?fù)浣Y(jié)構(gòu)得出DataNode與客戶端的距離,然后進(jìn)行排序。排序有兩個(gè)規(guī)則:網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)中距離客戶端近的則靠前;心跳機(jī)制中超時(shí)匯報(bào)的DataNode狀
MapReduce程序如何設(shè)置本地運(yùn)行模式?
MapReduce程序如何設(shè)置本地運(yùn)行模式?
2020-12-01大數(shù)據(jù)的兩種計(jì)算框架對(duì)比,哪個(gè)更適合開(kāi)發(fā)?
2020-11-18Scala算術(shù)操作符重載怎樣使用?與Java語(yǔ)法的區(qū)別有哪些
2020-11-18大數(shù)據(jù)MapReduce的性能調(diào)優(yōu)方法總結(jié)
2020-11-18HBase中常見(jiàn)的Shell命令有哪幾個(gè)?具體是怎樣操作的?
2020-11-17HDFS的高可用架構(gòu)是怎樣工作的?
2020-11-12