教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

HDFS讀寫流程介紹,HDFS讀數(shù)據(jù)和寫數(shù)據(jù)的原理是什么?

更新時(shí)間:2020年12月01日18時(shí)29分 來(lái)源:傳智教育 瀏覽次數(shù):

傳智教育-一樣的教育,不一樣的品質(zhì)

      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狀




猜你喜歡:

HBase表常見(jiàn)Shell命令及具體語(yǔ)法操作講解

Zookeeper分布式系統(tǒng)的集群架構(gòu)介紹

黑馬程序員大數(shù)據(jù)培訓(xùn)課程 

傳智播客大數(shù)據(jù)培訓(xùn)課程 

0 分享到:
和我們?cè)诰€交談!