首頁技術(shù)文章正文

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

更新時(shí)間:2020-12-01 來源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif     
Client(客戶端)對HDFS中的數(shù)據(jù)進(jìn)行讀寫操作,分別是Client從HDFS中查找數(shù)據(jù),即為Read(讀)數(shù)據(jù);Client從HDFS中存儲(chǔ)數(shù)據(jù),即為Write(寫)數(shù)據(jù)。下面我們對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)建備份的,接下來我們來學(xué)習(xí)客戶端向HDFS中的寫數(shù)據(jù)的流程,如圖2所示。

  圖2 HDFS寫數(shù)據(jù)流程

  從圖2可以看出,HDFS中的寫數(shù)據(jù)流程可以分為12個(gè)步驟,具體如下:

  (1) 客戶端發(fā)起文件上傳請求,通過RPC(遠(yuǎn)程過程調(diào)用)與NameNode建立通訊。

  (2) NameNode檢查元數(shù)據(jù)文件的系統(tǒng)目錄樹。

  (3) 若系統(tǒng)目錄樹的父目錄不存在該文件相關(guān)信息,返回客戶端可以上傳文件。

  (4) 客戶端請求上傳第一個(gè)Block數(shù)據(jù)塊,以及數(shù)據(jù)塊副本的數(shù)量(可以自定義副本數(shù)量,也可以使用集群規(guī)劃的副本數(shù)量)。

  (5) NameNode檢測元數(shù)據(jù)文件中DataNode信息池,找到可用的數(shù)據(jù)節(jié)點(diǎn)(DataNode_01,DataNode_02,DataNode_03)。

  (6) 將可用的數(shù)據(jù)節(jié)點(diǎn)的IP地址返回給客戶端。

  (7) 客戶端請求3臺(tái)節(jié)點(diǎn)中的一臺(tái)服務(wù)器DataNode_01,進(jìn)行傳送數(shù)據(jù)(本質(zhì)上是一個(gè)RPC調(diào)用,建立管道Pipeline),DataNode_01收到請求會(huì)繼續(xù)調(diào)用服務(wù)器DataNode_02,然后服務(wù)器DataNode_02調(diào)用服務(wù)器DataNode_03。

  (8) DataNode之間建立Pipeline后,逐個(gè)返回建立完畢信息。

  (9) 客戶端與DataNode建立數(shù)據(jù)傳輸流,開始發(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ì)再次請求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ù)的流程,接下來我們來學(xué)習(xí)客戶端從HDFS中讀數(shù)據(jù)的流程,如圖3所示。

  圖3 HDFS讀數(shù)據(jù)流程

  從圖3可以看出,HDFS中的讀數(shù)據(jù)流程可以分為4個(gè)步驟,具體如下:

  (1) 客戶端向NameNode發(fā)起RPC請求,來獲取請求文件Block數(shù)據(jù)塊所在的位置。

  (2) NameNode檢測元數(shù)據(jù)文件,會(huì)視情況返回Block塊信息或者全部Block塊信息,對于每個(gè)Block塊,NameNode都會(huì)返回含有該Block副本的DataNode地址。

  (3) 客戶端會(huì)選取排序靠前的DataNode來依次讀取Block塊(如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù)),每一個(gè)Block都會(huì)進(jìn)行CheckSum(完整性驗(yàn)證),若文件不完整,則客戶端會(huì)繼續(xù)向NameNode獲取下一批的Block列表,直到驗(yàn)證讀取出來文件是完整的,則Block讀取完畢。

  (4) 客戶端會(huì)把最終讀取出來所有的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)行模式?

大數(shù)據(jù)MapReduce的性能調(diào)優(yōu)方法總結(jié)

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

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!