官术网_书友最值得收藏!

3.4 HDFS的數(shù)據(jù)讀寫過程

在介紹HDFS數(shù)據(jù)讀寫過程之前,需要簡單介紹一下相關(guān)的類。File System是一個通用文件系統(tǒng)的抽象基類,可以被分布式文件系統(tǒng)繼承,所有可能使用Hadoop文件系統(tǒng)的代碼都要使用到這個類。Hadoop為File System這個抽象類提供了多種具體的實現(xiàn),Distributed File System就是File System在HDFS文件系統(tǒng)中的實現(xiàn)。FileSystem的open()方法返回的是一個輸入流FS Data Input Stream對象,在HDFS文件系統(tǒng)中,具體的輸入流就是DFS Input Stream;File System中的create()方法返回的是一個輸入流FS Data Output Stream對象,在HDFS文件系統(tǒng)中,具體的輸出流就是DFS Output Stream。

3.4.1 讀數(shù)據(jù)的過程

1.概述

客戶端將要讀取的文件路徑發(fā)送給NameNode,NameNode獲取文件的元信息(主要是block的存放位置信息)返回給客戶端,客戶端根據(jù)返回的信息找到相應(yīng)DataNode逐個獲取文件的block并在客戶端本地進行數(shù)據(jù)追加合并,從而獲得整個文件。

2.讀數(shù)據(jù)步驟詳解

1)如圖3-23所示客戶端向NameNode發(fā)起RPC調(diào)用,請求讀取文件數(shù)據(jù)。

2)NameNode檢查文件是否存在,如果存在則獲取文件的元信息(blockID以及對應(yīng)的DataNode列表)。

圖3-23 讀文件

3)客戶端收到元信息后,選取一個距離網(wǎng)絡(luò)最近的DataNode,依次請求讀取每個數(shù)據(jù)塊。客戶端首先要校檢文件是否損壞,如果損壞,客戶端會選取另外的DataNode請求。

4)DataNode與客戶端socket連接,傳輸對應(yīng)的數(shù)據(jù)塊,客戶端收到數(shù)據(jù)緩存到本地之后寫入文件。

5)依次傳輸剩下的數(shù)據(jù)塊,直到整個文件合并完成。

從某個DataNode獲取的數(shù)據(jù)塊有可能是損壞的,損壞可能是由DataNode的存儲設(shè)備錯誤、網(wǎng)絡(luò)錯誤或者軟件bug造成的。HDFS客戶端軟件實現(xiàn)了對HDFS文件內(nèi)容的校驗和檢查。當客戶端創(chuàng)建一個新的HDFS文件,會計算這個文件每個數(shù)據(jù)塊的校驗和,并將校驗和作為一個單獨的隱藏文件保存在同一個HDFS名字空間下。當客戶端獲取文件內(nèi)容后,它會檢驗從DataNode獲取的數(shù)據(jù)跟相應(yīng)的校驗和文件中的校驗和是否匹配,如果不匹配,客戶端可以選擇從其他DataNode獲取該數(shù)據(jù)塊的副本。

3.4.2 寫數(shù)據(jù)的過程

1.概述

客戶端要向HDFS寫數(shù)據(jù),首先要跟NameNode通信以確認可以寫文件并獲得接收文件block的DataNode,然后客戶端按順序逐個將block傳遞給相應(yīng)DataNode,并由接收到block的DataNode負責向其他DataNode復(fù)制block的副本。

2.寫數(shù)據(jù)步驟詳解

1)如圖3-24所示,客戶端向NameNode發(fā)送上傳文件請求,NameNode對要上傳的目錄和文件進行檢查,判斷是否可以上傳,并向客戶端返回檢查結(jié)果。

2)客戶端得到上傳文件的允許后讀取客戶端配置,如果沒有指定配置則會讀取默認配置(例如副本數(shù)和塊大小默認為3MB和128MB,副本是由客戶端決定的)。向NameNode請求上傳一個數(shù)據(jù)塊。

3)NameNode會根據(jù)客戶端的配置來查詢DataNode信息,如果使用默認配置,那么最終結(jié)果會返回同一個機架的兩個DataNode和另一個機架的DataNode。這稱為“機架感知”策略。

4)客戶端在開始傳輸數(shù)據(jù)塊之前會把數(shù)據(jù)緩存在本地,當緩存大小超過了一個數(shù)據(jù)塊的大小時,客戶端就會從NameNode獲取要上傳的DataNode列表。之后會在客戶端和第一個Da taNode建立連接開始流式地傳輸數(shù)據(jù),這個DataNode會一小部分一小部分(4KB)地接收數(shù)據(jù)然后寫入本地倉庫,同時會把這些數(shù)據(jù)傳輸?shù)降诙€DataNode,第二個DataNode也同樣一小部分一小部分地接收數(shù)據(jù)并寫入本地倉庫,同時傳輸給第三個DataNode,依次類推。這樣逐級調(diào)用和返回之后,待這個數(shù)據(jù)塊傳輸完成,客戶端會告訴NameNode數(shù)據(jù)塊傳輸完成,這時候NameNode才會更新元數(shù)據(jù)信息記錄操作日志。

圖3-24 寫文件

5)第一個數(shù)據(jù)塊傳輸完成后會使用同樣的方式傳輸下面的數(shù)據(jù)塊,直到整個文件上傳完成。

3.HDFS數(shù)據(jù)刪除

HDFS刪除數(shù)據(jù)比較流程相對簡單,只列出詳細步驟。

1)客戶端向NameNode發(fā)起RPC調(diào)用,請求刪除文件。NameNode檢查合法性。

2)NameNode查詢文件相關(guān)元信息,向存儲文件數(shù)據(jù)塊的DataNode發(fā)出刪除請求。

3)DataNode刪除相關(guān)數(shù)據(jù)塊,返回結(jié)果。

4)NameNode返回結(jié)果給客戶端。

當用戶或應(yīng)用程序刪除某個文件時,這個文件并沒有立刻從HDFS中刪除。實際上,HDFS會將這個文件重命名轉(zhuǎn)移到/trash目錄。只要文件還在/trash目錄中,該文件就可以被迅速地恢復(fù)。文件在/trash中保存的時間是可配置的,當超過這個時間時,NameNode就會將該文件從名字空間中刪除。刪除文件會使得該文件相關(guān)的數(shù)據(jù)塊被釋放。注意,從用戶刪除文件到HDFS空閑空間的增加之間會有一定的時間延遲。只要被刪除的文件還在/trash目錄中,用戶就可以恢復(fù)這個文件。如果用戶想恢復(fù)被刪除的文件,可以瀏覽/trash目錄找回該文件。/trash目錄僅僅保存被刪除文件的最后副本。/trash目錄與其他的目錄沒有什么區(qū)別,除了一點:在該目錄上HDFS會應(yīng)用一個特殊策略來自動刪除文件。目前的默認策略是刪除/trash中保留時間超過6h的文件。將來,這個策略可以通過一個被良好定義的接口配置。

當一個文件的副本系數(shù)被減小后,NameNode會選擇過剩的副本刪除。下次心跳檢測時,會將該信息傳遞給DataNode。DataNode遂即移除相應(yīng)的數(shù)據(jù)塊,集群中的空閑空間加大。同樣,在調(diào)用setReplication API結(jié)束和集群中空閑空間增加之間,也會有一定的延遲。

4.安全模式

NameNode啟動后會進入一個被稱為安全模式的特殊狀態(tài)。處于安全模式的NameNode是不會進行數(shù)據(jù)塊復(fù)制的。NameNode從所有的DataNode接收心跳信號和塊狀態(tài)報告。塊狀態(tài)報告包括某個DataNode所有的數(shù)據(jù)塊列表。每個數(shù)據(jù)塊都有一個指定的最小副本數(shù)。當NameNode檢測確認某個數(shù)據(jù)塊的副本數(shù)目達到這個最小值,那么該數(shù)據(jù)塊就會被認為是副本安全(Safely Replicated)的;在一定百分比(這個參數(shù)可配置)的數(shù)據(jù)塊被NameNode檢測確認是安全之后(加上一個額外的30s等待時間),NameNode將退出安全模式狀態(tài)。接下來它會確定還有哪些數(shù)據(jù)塊的副本沒有達到指定數(shù)目,并將這些數(shù)據(jù)塊復(fù)制到其他DataNode上。

5.細節(jié)

1)請求和應(yīng)答是使用RPC的方式,客戶端通過Client Protocol與NameNode通信,NameNode和DataNode之間使用DataNode Protocol交互。在設(shè)計上,NameNode不會主動發(fā)起RPC,而是響應(yīng)來自客戶端或DataNode的RPC請求。客戶端和DataNode之間使用socket進行數(shù)據(jù)傳輸,和NameNode之間的交互采用NIO封裝的RPC。

2)HDFS有自己的序列化協(xié)議。

3)在數(shù)據(jù)塊傳輸成功后并且客戶端沒有告訴NameNode之前,如果NameNode宕機,那么這個數(shù)據(jù)塊就會丟失。

4)在流式復(fù)制時,逐級傳輸和響應(yīng)采用響應(yīng)隊列來等待傳輸結(jié)果。隊列響應(yīng)完成后返回給客戶端。

5)在流式復(fù)制時如果有一臺或兩臺(不是全部)沒有復(fù)制成功,并不影響最后結(jié)果,只不過DataNode會定期向NameNode匯報自身信息。如果發(fā)現(xiàn)異常NameNode會指揮DataNode刪除殘余數(shù)據(jù)和完善副本,如果副本數(shù)量少于某個最小值就會進入安全模式。

主站蜘蛛池模板: 新巴尔虎左旗| 兰州市| 剑川县| 泸定县| 吉隆县| 苗栗县| 三台县| 崇阳县| 东阳市| 南京市| 鄂尔多斯市| 曲周县| 汽车| 钦州市| 惠东县| 乌拉特中旗| 阳原县| 商洛市| 晋江市| 两当县| 象山县| 泸州市| 翁牛特旗| 大方县| 靖州| 浠水县| 邮箱| 龙泉市| 都江堰市| 普洱| 和龙市| 老河口市| 裕民县| 乌海市| 长宁区| 田阳县| 修文县| 达州市| 琼结县| 林甸县| 河津市|