hdfs(hadoop distributed file system)是gfs的開源實現。
1、優點
因為有多個副本,可以保證資料可靠,容錯性高
計算向資料移動,適用於批處理
適合大資料處理,gb、tb、pb級資料,百萬以上的檔案,十萬以上的節點
可以構建在廉價機器上,通過多副本提高可靠性
2、缺點
不支援低延遲的資料訪問,無法再毫秒之內返回結果
小檔案對於hdfs是致命的,會占用大量的namenode的儲存空間
寫流程如下:
1、客戶端訪問namenode,namenode檢查路徑和許可權,如果路徑中有與要上傳的檔案重名的檔案就不能上傳了,不能覆蓋,如果沒有才建立,建立名為file.copying的臨時檔案;
2、namenode觸發副本放置策略,如果客戶端在集群內的某一台機器,那麼副本第一塊放置在該伺服器上,然後再另外挑兩台伺服器;如果在集群外,namenode會根據策略先找乙個機架選出乙個datanode,然後再從另外的機架選出另外兩個datanode,然後namenode會將選出的三個datanode按距離組建乙個順序,然後將順序返回給客戶端;
3、客戶端會根據返回的三個節點和第乙個節點建立乙個socket連線(只會和第乙個節點建立),第乙個節點又會和第二個節點建立socket連線,由第二個節點又會和第三個節點建立乙個socket連線,這種連線的方式叫pipeline;
4、客戶端會將block切分成package(預設是64kb),以流式在pipeline中傳輸
好處:(1)速度快:時間線重疊(其實流式也是一種變異的並行);
(2)客戶端簡單:副本的概念是透明的;
5、由datanode完成接收block塊後,block的metadata(md5校驗用)通過乙個心跳將資訊匯報給namenode;
6、如果再pipeline傳輸中,任意節點失敗,上游節點直接連線失敗節點的下游節點繼續傳輸,最終在第5步匯報後,namenode會發現副本數不足,一定會觸發datanode複製更多副本,客戶端client副本透明;
7、client一直重複以上操作,逐一將block塊上傳,同時datanode匯報block的位置資訊,時間線重疊;
8、最終,如果namenode收到了datanode匯報的所有塊的資訊,將檔案的.copying去掉,檔案可用。
讀流程如下:
1、客戶端和namenode建立連線,獲取檔案block的位置資訊(fileblocklocations)
需要用inputstream.seek(long)//從什麼位置開始讀取,和哪個datanode開始連線獲取block;
3、距離的概念:只有檔案系統在讀流程中附加距離優先的概念,計算層才能夠被動實現計算向資料移動,距離有以下三種:
(1)本地,最近的距離;
(2)同機架,次之的距離;
(3)other(資料中心),最遠的距離;
看到了這裡,你會發現 hdfs 檔案系統的讀寫流程並不複雜,很容易被小夥伴們忽略,所以趕緊mark起來吧!
我是大資料每日嗶嗶,歡迎關注我,一起聊大資料!
寫入hdfs HDFS讀取和寫入資料簡介
hdfs 的檔案訪問機制為流式訪問機制,即通過 api 開啟檔案的某個資料塊之後,可以順序讀取或者寫入某個檔案。由於 hdfs 中存在多個角色,且對應的應用場景主要為一次寫入 多次讀取的場景,因此其讀和寫的方式有較大不同。讀 寫操作都由客戶端發起,並且由客戶端進行整個流程的控制,namenode 和...
Java不覆蓋原檔案寫入
filewriter和fileoutputstream都提供了很多構造方法。我們以fileoutputstream為例,filewriter也同理 我們常用的宣告方式是 fileoutputstream file file 建立乙個向指定file物件表示的檔案中寫入資料的檔案輸出流。建立乙個新fil...
python中讀寫指標引起的寫入覆蓋
讀寫指標的問題 in 1 i open 0427text.txt w 0427text.txt 沒有檔案的時候會建立檔案 in 2 i.read 讀取0427text.txt out 2 內容為空 in 3 i.tell 檢視讀寫指標位置 out 3 0 讀寫指標位置為0 in 4 i.write ...