hdfs 的檔案訪問機制為流式訪問機制,即通過 api 開啟檔案的某個資料塊之後,可以順序讀取或者寫入某個檔案。由於 hdfs 中存在多個角色,且對應的應用場景主要為一次寫入、多次讀取的場景,因此其讀和寫的方式有較大不同。讀/寫操作都由客戶端發起,並且由客戶端進行整個流程的控制,namenode 和 datanode 都是被動式響應。
客戶端發起讀取請求時,首先與 namenode 進行連線。
連線建立完成後,客戶端會請求讀取某個檔案的某乙個資料塊。namenode 在記憶體中進行檢索,檢視是否有對應的檔案及檔案塊,若沒有則通知客戶端對應檔案或資料塊不存在,若有則通知客戶端對應的資料塊存在哪些伺服器之上。
客戶端接收到資訊之後,與對應的 datanode 連線,並開始進行資料傳輸。客戶端會選擇離它最近的乙個副本資料進行讀操作。
如圖 1 所示,讀取檔案的具體過程如下。1)客戶端呼叫 distributedfilesystem 的 open() 方法開啟檔案。2)distributedfilesystem 用 rpc 連線到 namenode,請求獲取檔案的資料塊的資訊;namenode 返回檔案的部分或者全部資料塊列表;對於每個資料塊,namenode 都會返回該資料塊副本的 datanode 位址;distributedfilesystem 返回 fsdatainputstream 給客戶端,用來讀取資料。3)客戶端呼叫 fsdatainputstream 的 read() 方法開始讀取資料。4)fsinputstream 連線儲存此檔案第乙個資料塊的最近的 datanode,並以資料流的形式讀取資料;客戶端多次呼叫 read(),直到到達資料塊結束位置。5)fsinputstream連線儲存此檔案下乙個資料塊的最近的 datanode,並讀取資料。6)當客戶端讀取完所有資料塊的資料後,呼叫 fsdatainputstream 的 close() 方法。
在讀取資料的過程中,如果客戶端在與資料結點通訊時出現錯誤,則嘗試連線包含此資料塊的下乙個資料結點。失敗的資料結點將被記錄,並且以後不再連線。
寫入檔案的過程比讀取較為複雜,在不發生任何異常情況下,客戶端向 hdfs 寫入資料的流程如圖 2 所示,具體步驟如下。
1)客戶端呼叫 distribuedfilesystem 的 create() 方法來建立檔案。2)distributedfilesystem 用 rpc 連線 namenode,請求在檔案系統的命名空間中建立乙個新的檔案;namenode 首先確定檔案原來不存在,並且客戶端有建立檔案的許可權,然後建立新檔案;distributedfilesystem 返回 fsoutputstream 給客戶端用於寫資料。3)客戶端呼叫 fsoutputstream 的 write() 函式,向對應的檔案寫入資料。4)當客戶端開始寫入檔案時,fsoutputstream 會將檔案切分成多個分包(packet),並寫入其內部的資料佇列。fsoutputstream 向 namenode 申請用來儲存檔案和副本資料塊的若干個 datanode,這些 datanode 形成乙個資料流管道。
佇列中的分包被打包成資料報,發往資料流管道中的第乙個 datanode。第乙個 datanode 將資料報傳送給第二個 datanode,第二個 datanode 將資料報傳送到第三個 datanode。這樣,資料報會流經管道上的各個 datanode。5)為了保證所有 datanode 的資料都是準確的,接收到資料的 datanode 要向傳送者傳送確認包(ack packet)。確認包沿著資料流管道反向而上,從資料流管道依次經過各個 datanode,並最終發往客戶端。當客戶端收到應答時,它將對應的分包從內部佇列中移除。6)不斷執行第 (3)~(5)步,直到資料全部寫完。7)呼叫 fsoutputstream 的 close() 方法,將所有的資料塊寫入資料流管道中的資料結點,並等待確認返回成功。最後通過 namenode 完成寫入。
xml讀取和寫入
1 需要的命名空間 using system.collections.generic using system.io using system.text using system.xml 3 寫入後的xml檔案樣式 1神州俠侶 5045.55 tiger 以下 為自動建立序號時使用,若你的資料來源本...
檔案讀取和寫入
open 返回乙個檔案物件,open filename,mode f open workfile w 第乙個引數是包含檔名的字串,第二個引數可以是包含一些字元的字串 r 僅讀取檔案,w 僅寫入檔案,a 開啟檔案以進行新增的模式 r 開啟檔案進行讀取和寫入,模式引數是可選的。r 如果省略,將被假定。b...
讀取和寫入Cookies
region 讀取或寫入cookie 2 3 寫cookie值 4 5 名稱 6 值 7 public static void writecookie string strname,string strvalue 8 14 cookie.value urlencode strvalue 16 17 ...