Hadoop學習之路(十一)HDFS的讀寫詳解

HDFS的寫操做

《HDFS權威指南》圖解HDFS寫過程

        

詳細文字說明(術語)

一、使用 HDFS 提供的客戶端 Client,向遠程的 namenode 發起 RPC 請求node

二、namenode 會檢查要建立的文件是否已經存在,建立者是否有權限進行操做,成功則會 爲文件建立一個記錄,不然會讓客戶端拋出異常;app

三、當客戶端開始寫入文件的時候,客戶端會將文件切分紅多個 packets,並在內部以數據隊列「data queue(數據隊列)」的形式管理這些 packets,並向 namenode 申請 blocks,獲 取用來存儲 replicas 的合適的 datanode 列表,列表的大小根據 namenode 中 replication 的設定而定;異步

四、開始以 pipeline(管道)的形式將 packet 寫入全部的 replicas 中。客戶端把 packet 以流的 方式寫入第一個 datanode,該 datanode 把該 packet 存儲以後,再將其傳遞給在此 pipeline 中的下一個 datanode,直到最後一個 datanode,這種寫數據的方式呈流水線的形式。工具

五、最後一個 datanode 成功存儲以後會返回一個 ack packet(確認隊列),在 pipeline 裏傳遞 至客戶端,在客戶端的開發庫內部維護着"ack queue",成功收到 datanode 返回的 ack packet 後會從"data queue"移除相應的 packet。oop

六、若是傳輸過程當中,有某個 datanode 出現了故障,那麼當前的 pipeline 會被關閉,出現故 障的 datanode 會從當前的 pipeline 中移除,剩餘的 block 會繼續剩下的 datanode 中繼續 以 pipeline 的形式傳輸,同時 namenode 會分配一個新的 datanode,保持 replicas 設定的 數量。url

七、客戶端完成數據的寫入後,會對數據流調用 close()方法,關閉數據流;spa

八、只要寫入了 dfs.replication.min(最小寫入成功的副本數)的複本數(默認爲 1),寫操做 就會成功,而且這個塊能夠在集羣中異步複製,直到達到其目標複本數(dfs.replication 的默認值爲 3),由於 namenode 已經知道文件由哪些塊組成,因此它在返回成功前只需 要等待數據塊進行最小量的複製。blog

詳細文字說明(口語)

一、客戶端發起請求:hadoop fs -put hadoop.tar.gz / 隊列

客戶端怎麼知道請求發給那個節點的哪一個進程?進程

由於客戶端會提供一些工具來解析出來你所指定的HDFS集羣的主節點是誰,以及端口號等信息,主要是經過URI來肯定,

url:hdfs://hadoop1:9000

當前請求會包含一個很是重要的信息: 上傳的數據的總大小

二、namenode會響應客戶端的這個請求

namenode的職責:

1 管理元數據(抽象目錄樹結構)

用戶上傳的那個文件在對應的目錄若是存在。那麼HDFS集羣應該做何處理,不會處理

用戶上傳的那個文件要存儲的目錄不存在的話,若是不存在不會建立

二、響應請求

真正的操做:作一系列的校驗,

一、校驗客戶端的請求是否合理
二、校驗客戶端是否有權限進行上傳

三、若是namenode返回給客戶端的結果是 經過, 那就是容許上傳

namenode會給客戶端返回對應的全部的數據塊的多個副本的存放節點列表,如:

file1_blk1 hadoop02,hadoop03,hadoop04
file1_blk2 hadoop03,hadoop04,hadoop05

四、客戶端在獲取到了namenode返回回來的全部數據塊的多個副本的存放地的數據以後,就能夠按照順序逐一進行數據塊的上傳操做

五、對要上傳的數據塊進行邏輯切片

切片分紅兩個階段:

一、規劃怎麼切
二、真正的切

物理切片: 1 和 2

邏輯切片: 1

file1_blk1 : file1:0:128
file1_blk2 : file1:128:256

  邏輯切片只是規劃了怎麼切

  

六、開始上傳第一個數據塊

七、客戶端會作一系列準備操做

一、依次發送請求去鏈接對應的datnaode

pipline : client - node1 - node2 - node3

按照一個個的數據包的形式進行發送的。

每次傳輸完一個數據包,每一個副本節點都會進行校驗,依次原路給客戶端

二、在客戶端會啓動一個服務:

用戶就是用來等到未來要在這個pipline數據管道上進行傳輸的數據包的校驗信息

客戶端就能知道當前從clinet到寫node1,2,3三個節點上去的數據是否都寫入正確和成功

八、clinet會正式的把這個快中的全部packet都寫入到對應的副本節點

一、block是最大的一個單位,它是最終存儲於DataNode上的數據粒度,由dfs.block.size參數決定,2.x版本默認是128M;注:這個參數由客戶端配置決定;如:System.out.println(conf.get("dfs.blocksize"));//結果是134217728

二、packet是中等的一個單位,它是數據由DFSClient流向DataNode的粒度,以dfs.write.packet.size參數爲參考值,默認是64K;注:這個參數爲參考值,是指真正在進行數據傳輸時,會以它爲基準進行調整,調整的緣由是一個packet有特定的結構,調整的目標是這個packet的大小恰好包含結構中的全部成員,同時也保證寫到DataNode後當前block的大小不超過設定值;

如:System.out.println(conf.get("dfs.write.packet.size"));//結果是65536

三、chunk是最小的一個單位,它是DFSClient到DataNode數據傳輸中進行數據校驗的粒度,由io.bytes.per.checksum參數決定,默認是512B;注:事實上一個chunk還包含4B的校驗值,於是chunk寫入packet時是516B;數據與檢驗值的比值爲128:1,因此對於一個128M的block會有一個1M的校驗文件與之對應;

如:System.out.println(conf.get("io.bytes.per.checksum"));//結果是512


九、clinet進行校驗,若是校驗經過,表示該數據塊寫入成功

十、重複7 8 9 三個操做,來繼續上傳其餘的數據塊

十一、客戶端在乎識到全部的數據塊都寫入成功以後,會給namenode發送一個反饋,就是告訴namenode當前客戶端上傳的數據已經成功。

 HDFS讀操做

《HDFS權威指南》圖解HDFS讀過程

數據讀取

一、客戶端調用FileSystem 實例的open 方法,得到這個文件對應的輸入流InputStream。

二、經過RPC 遠程調用NameNode ,得到NameNode 中此文件對應的數據塊保存位置,包括這個文件的副本的保存位置( 主要是各DataNode的地址) 。

三、得到輸入流以後,客戶端調用read 方法讀取數據。選擇最近的DataNode 創建鏈接並讀取數據。

四、若是客戶端和其中一個DataNode 位於同一機器(好比MapReduce 過程當中的mapper 和reducer),那麼就會直接從本地讀取數據。

五、到達數據塊末端,關閉與這個DataNode 的鏈接,而後從新查找下一個數據塊。

六、不斷執行第2 - 5 步直到數據所有讀完。

七、客戶端調用close ,關閉輸入流DF S InputStream。

相關文章
相關標籤/搜索