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