產生背景及定義
HDFS:分佈式文件系統,用於存儲文件,主要特色在於其分佈式,即有不少服務器聯合起來實現其功能,集羣中的服務器各有各的角色node
- 隨着數據量愈來愈大,一個操做系統存不下全部的數據,那麼就分配到更多的操做系統管理的磁盤中,可是管理和維護極不方便,因而迫切須要一種系統來管理多臺機器上的文件,這就是分佈式管理系統,HDFS是其中一種。
- HDFS的使用適合一次寫入,屢次讀出的場景,且不支持對文件的直接修改,僅支持在文件末尾追加
- HDFS採用流式的數據訪問方式:特色就是像流水同樣,數據不是一次過來,而是一點一點「流」過來,處理數據也是一點一點處理。若是是數據所有過來以後才處理,那麼延遲就會很大,並且會消耗很大的內存。
優缺點
- 高容錯性
- 數據自動保存多個副本,經過增長副本的方式,提升容錯性
- 若某一個副本丟失後,它能夠自動分配到其它節點做爲新的副本
- 處理大數據
- 數據規模:可以處理的數據規模能夠達到GB,TB,甚至PB級別的數據
- 文件規模:可以處理百萬規模以上的文件數量,數量至關之大
- 可構建在廉價的機器上,經過多副本機制,提升可靠性
組成架構
namenode(nn)
:就是Master,是一個管理者,存放元數據
- 管理HDFS的名稱空間
- 配置副本策略
- 管理數據塊的映射信息
- 處理客戶端的讀寫請求
datanode(dn)
:就是slave,真正存儲文件的地方
secondarynamenode(2nn)
:並不是namenode的熱備,當namenode掛掉的時候,並不能立刻替換namenode並提供服務
- 做爲namenode的輔助,分擔其工做量,好比按期合併Fsimage和Edits(文章後邊會講到這兩個東西),並推送給namenode
- 在緊急狀況下,可輔助恢復namenode,可是隻能恢復部分,而不能所有恢復
client
:客戶端
- 文件的切分,在上傳HDFS以前,client將文件切分爲一個一個的Block,而後一個一個進行上傳
- 與namenode交互,獲取文件的datanode信息
- 與datanode交互,讀取或寫入數據
- client提供一些命令來管理HDFS,好比namenode的格式化
- client經過一些命令來訪問HDFS,好比對HDFS的增刪查改等
文件塊大小
爲何要把文件抽象爲Block塊存儲?緩存
- block的拆分使得單個文件大小能夠大於整個磁盤的容量,構成文件的Block能夠分佈在整個集羣, 理論上,單個文件能夠佔據集羣中全部機器的磁盤。
- Block的抽象也簡化了存儲系統,對於Block,無需關注其權限,全部者等內容(這些內容都在文件級別上進行控制)。
- Block做爲容錯和高可用機制中的副本單元,即以Block爲單位進行復制。
HDFS中的文件在物理內存中分塊存儲(Block),塊的大小在Hadoop2.x版本中默認爲128M,在老版本中爲64M,那麼爲何爲128M呢?服務器
其實,HDFS的塊的大小的設置主要取決於磁盤傳輸速率,以下:網絡
- 若是在HDFS中,尋址時間爲10ms,即查找到目標Block的時間爲10ms
- 專家說操做的最佳狀態爲:尋址時間爲傳輸時間的1%,所以傳輸時間爲1s
- 而目前磁盤的傳輸速率廣泛爲100M/s
爲何塊大小不能設置過小,也不能設置太大?架構
- HDFS的塊設置過小,會增長尋址時間,使得程序可能一直在尋找塊的開始位置
- 若是設置的太大,從磁盤傳輸數據的時間會明顯大於定位這個塊所需的尋址時間,致使程序處理這塊數據時會很是慢
HDFS的數據流
HDFS寫數據流程
- 客戶端經過Distributed FileSystem模塊向NameNode請求上傳文件,NameNode檢查目標文件是否已存在,父目錄是否存在。
- NameNode返回是否能夠上傳。
- 客戶端請求第一個 Block上傳到哪幾個DataNode服務器上。
- NameNode返回3個DataNode節點,分別爲dn一、dn二、dn3, 若是有多個節點,返回實際的副本數量,並根據距離及負載狀況計算
- 客戶端經過FSDataOutputStream模塊請求dn1上傳數據,dn1收到請求會繼續調用dn2,而後dn2調用dn3,將這個通訊管道創建完成。
- dn一、dn二、dn3逐級應答客戶端。
- 客戶端開始往dn1上傳第一個Block(先從磁盤讀取數據放到一個本地內存緩存),以Packet爲單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答隊列等待應答。
- 當一個Block傳輸完成以後,客戶端再次請求NameNode上傳第二個Block的服務器。(重複執行3-7步)。
網絡拓撲---節點距離計算
在HDFS寫數據的過程當中,NameNode會選擇距離待上傳數據最近距離的DataNode接收數據,那麼這個最近距離是怎麼計算的呢?分佈式
結論:兩個節點到達最近的共同祖先的距離總和,即爲節點距離。oop
如上圖所示:大數據
- 同一節點上的進程節點距離爲0
- 同一機架上不一樣節點的距離爲兩個節點到共同機架r1的距離總和,爲2
- 同一數據中心不一樣機架的節點距離爲兩個節點到共同祖先集羣d1的距離之和,爲4
- 不一樣數據中心的節點距離爲兩個節點到達共同祖先數據中心的距離之和,爲6
機架感知(副本存儲的節點選擇)
副本的數量咱們能夠從配置文件中設置,那麼HDFS是怎麼選擇副本存儲的節點的呢?操作系統
如上圖所示,爲了提升容錯性,有以下設置,加入如今有3個副本:3d
- 第一個副本在Client所在的節點上,若是客戶端在集羣外,則隨機選一個
- 第二個副本和第一個副本位於相同機架,隨機節點
- 第三個副本位於不一樣機架,隨機節點
這樣作的目的就是爲了提升容錯性。
HDFS讀數據流程
- 客戶端經過Distributed FileSystem向NameNode請求下載文件,NameNode經過查詢元數據,找到文件塊所在的DataNode地址。
- 挑選一臺DataNode(就近原則,而後隨機)服務器,請求讀取數據。
- DataNode開始傳輸數據給客戶端(從磁盤裏面讀取數據輸入流,以Packet爲單位來作校驗)。
- 客戶端以Packet爲單位接收,先在本地緩存,而後寫入目標文件。