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