HDFS簡介
1.HDFS介紹
HDFS 為了做到可靠性( reliability ) 創建了多份數據塊(data blocks)的復制(replicas) ,並將它們放置在服務器群的計算節點中(compute nodes),MapReduce就可以在它們所在的節點上處理這些數據了。
1.1.HDFS結構
NameNode DataNode
存儲元數據(文件名,文件屬性) 存儲文件內容
元數據保存在內存中(磁盤中也會有一份),工作過程中在內存中讀數據 文件內容保存在磁盤
保存文件,block,datanode之間的映射關系 維護了block id到datanode本地文件的映射關系
1.2 HDFS 運行機制
- 一個名字節點和多個數據節點
- 數據復制(冗余機制)
- 存放的位置(機架感知策略)
- 故障檢測
- 數據節點
- 心跳包(檢測是否宕機)
- 塊報告(安全模式下檢測)
- 數據完整性檢測(校驗和比較)
- 名字節點(日誌文件,鏡像文件)
- 空間回收機制
1.3.HDFS優點
- 高容錯性
- 數據自動保存多個副本
- 副本丟失後,自動恢復
- 適合批處理
- 移動計算而非數據
- 數據位置暴露給計算框架
- 適合大數據處理
- GB\TB甚至PB級數據
- 百萬規模以上的文件數量
- 10k+節點
- 可構建在廉價機器上
- 通過多副本提高可靠性
- 提供了容錯和恢復機制
1.4 HDFS缺點
- 低延遲數據訪問
- 比如毫秒級
- 低延遲與高吞吐率
- 小文件存取
- 占用NameNode大量內存
- 尋道時間超過讀取時間
- 並發寫入、文件隨即修改
- 一個文件只能有一個寫者
- 僅支持append
NameNode存儲的是元數據,元數據的多少取決於文件的多少,元數據是存儲在內存中的。
不適合大量的小文件存儲
國內大部分網盤是用的HDFS
1.5 HDFS架構
HDFS客戶端請求的是NameNode, NameNode負責處理任務的請求,NameNode再將請求轉發給DataNode,請求DataNode實際是HDFS客戶端請求,圖有問題。
DataNode把所有數據都存儲在磁盤上
1.5.1 HDFS數據存儲單元(block)
- 文件被切分成固定大小的數據塊
- 默認數據塊大小為64mb,可配置
- 若文件大小不到64mb,則單獨存成一個block
- 一個文件存儲方式
- 按大小被切分成若幹個block,存儲到不同節點上
- 默認情況下每個block都有三個副本
- block大小和副本數通過client端上傳文件時設置,文件上傳成功後副本數可以變更,Block Size 不可變更
一個塊只可能存一個文件中的數據。只是一個邏輯結構,若不滿64mb的,磁盤上存儲的是文件的實際大小。
三個副本存儲在不同機器上
1.6節點
1.6.1 NameNode(NN)
- NameNode主要功能:接受客戶端的讀寫服務
- NameNode保存metadata(元數據)信息包括
- 文件owership 和 permissions
- 文件包含哪些塊
- block保存在哪個DataNode上(由DataNode啟動時上報,存在內存中)
- NameNode的metadate信息在啟動後會加載到內存
- metadata存儲到磁盤文件名為 fsimage
- block的位置信息不會保存到 fsimage
- edits記錄對metadata的操作日誌
整個過程中,metadata記錄的信息,磁盤中有一份,內容中也會有一份。(block位置信息不會保存在磁盤中)
如果啟動後進行了新添加文件的操作,那麽這個操作就會記錄到edits日誌文件中,並不會馬上修改fsimage文件,後期會進行合並操作。
NameNode工作的數據都在內存上
1.6.2 SecondaryNameNode(SNN)
- 它不是NN的備份(但可以做備份),它的主要工作是幫助NN合並edits log,減少NN啟動時間
- SNN執行合並時機
- 根據配置文件設置的時間間隔fs.checkpoint.period 默認是3600秒
- 根據配置文件設置edits log大小 fs.checkpoint.size規定edits文件的最大值,默認是64mb
合並會有大量的IO操作,如果合並操作由NameNode自己做的話,那麽計算機將會分配大量的內存空間給NameNode來做合並,會影響用戶的使用,NameNode主要是用來接收用戶的請求操作的,合並由SecondaryNameNode來做的話,可保證NameNode工作的專一性,提供性能。
SecondaryNameNode合並後會生成一個新的fsimage,會將該文件傳送給NameNode,替換原來的fsimage
合並流程:
fsimage: 磁盤中的元數據文件
edits: 日誌記錄文件
在將 edits、fsimage拷貝到SecondaryNameNode的同時,NameNode會新建一個edits文件,來記錄用戶的操作,edits文件為上次合並的時候產生的新的edits 文件。
在SecondaryNameNode將edits 和 fsimage合並成一個新的fsimage文件,合並之後,將fsimage推送給NameNode, NameNode將之前的fsimage替換掉
不是熱備,如果NameNode掛掉,那麽將會損失edits.new中的文件操作。
1.6.3 DataNode(DN)
- 存儲數據(block)
- 啟動DN線程的時候會向NN匯報block信息
- 通過向NN發送心跳保持與其聯系(3秒一次),如果NN10分鐘沒有收到DN的心跳,則認為其已經lost,並copy其上的block到其它DN
1.6.3.1 Block的副本放置策略
- 第一個副本:放置在上傳文件的DN
如果是集群外提交,則隨機挑選一臺磁盤不太滿,CPU不太忙的節點
- 第二個副本:放置在於第一個副本不同的機架的節點上
- 第三個副本:與第二個副本相同機架的節點。
- 更多副本:隨機節點。
機架:在節點的配置文件中會標明屬於哪個機架。
1.7 HDFS讀流程
在客戶端調用api請求NameNode,NameNode返回給數據塊的位置信息
客戶端拿到數據塊的位置信息後,通過另一個API並發的去讀各個block,拿到block之後合並為一個文件。(一般是讀小的文件)
1.8 HDFS寫流程
1.客戶端調用 Distributed FileSystem API ,參數包括文件信息,文件的擁有者2.NameNode拿到文件信息後,就可以計算出需要切幾個block,block分別存儲在哪些DataNode上,返回給客戶端
3.客戶端獲取之後,通過接口FSData CutputStream API 先將一個block寫入到DataNode中,其余的副本由DataNode開啟新的線程根據副本放置規則,往其它DataNode上進行復制。
4.復制完成後會返回一個回饋信息,然後再將該信息匯報給NameNode
註:DataNode中的副本,是由第一個接收到block的DataNode復制產生的。
1.9 HDFS文件權限
- 與Linux文件權限類似
- r : read
- w : write
- x : execute,權限x對於文件忽略,對於文件夾表示是否允許訪問其內容。
- 如果Linux系統用戶zhangsan使用hadoop命令創建一個文件,那麽這個文件在HDFS 中 owner 就是zhangsan
- HDFS的權限目的:阻止好人做錯事,而不是阻止壞人做壞事。HDFS相信,你告訴我你是誰,我就認為你是誰。
註:現在好像加密碼認證了。
1.10 安全模式
- NameNode啟動的時候,首先將映射文件(fsimage)載入內存,並執行編輯日誌(edits)中的各項操作
- 一旦在內存中成功建立文件系統元數據的映射,則創建一個新的fsimage文件(這個操作不需要SecondaryNameNode)和一個空的編輯日誌
- 此刻NameNode運行在安全模式。即NameNode的文件系統對於客戶端來說是只讀的。(顯示目錄,顯示文件內容等。寫、刪除、重命名都會失敗)
- 在此階段NameNode收集各個DataNode的報告,當數據塊達到最小副本數以上時,會被認為是安全的,在一定比例(可設置)的數據塊被確定為安全後,再過若幹時間,安全模式結束。
- 當檢測到副本數不足的數據塊時,該快會被復制知道達到最小副本數,系統中數據塊的位置並不是由NameNode維護的,而是以塊列表形式存儲在DataNode中。
在剛啟動HDFS的時候,會先進入一個安全模式,此模式下只可進行讀操作。
HDFS簡介