HDFS主要是用於作什麼的?
HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分佈式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文件的需求而開發的,能夠運行於廉價的商用服務器上。node
它所具備的高容錯、高可靠性、高可擴展性、高得到性、高吞吐率等特徵爲海量數據提供了不怕故障的存儲,爲超大數據集(Large Data Set)的應用處理帶來了不少便利。服務器
HDFS的優缺點比較
優勢
- 高容錯性
(1)數據自動保存多個副本。它經過增長副本的形式,提升容錯性
(2)某一個副本丟失之後,它能夠自動恢復,這是由 HDFS 內部機制實現的,咱們沒必要關心
- 適合批處理
(1)它是經過移動計算而不是移動數據
(2)它會把數據位置暴露給計算框架
- 適合大數據處理
(1)處理數據達到 GB、TB、甚至PB級別的數據
(2)可以處理百萬規模以上的文件數量,數量至關之大
(3)可以處理10K節點的規模
- 流式文件訪問
(1)一次寫入,屢次讀取。文件一旦寫入不能修改,只能追加
(2)它能保證數據的一致性
- 可構建在廉價機器上
(1)它經過多副本機制,提升可靠性
(2)它提供了容錯和恢復機制。好比某一個副本丟失,能夠經過其它副原本恢復
缺點
- 低延時數據訪問
(1)好比毫秒級的來存儲數據,這是不行的,它作不到
(2)它適合高吞吐率的場景,就是在某一時間內寫入大量的數據。可是它在低延時的狀況下是不行的,好比毫秒級之內讀取數據,這樣它是很難作到的
- 小文件存儲
(1)存儲大量小文件的話,它會佔用 NameNode大量的內存來存儲文件、目錄和塊信息。這樣是不可取的,由於NameNode的內存老是有限的
(2)小文件存儲的尋道時間會超過讀取時間,它違反了HDFS的設計目標
- 併發寫入、文件隨機修改
(1)一個文件只能有一個寫,不容許多個線程同時寫
(2)僅支持數據 append(追加),不支持文件的隨機修改
HDFS 如何存儲數據?
HDFS 採用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別爲HDFS Client、NameNode、DataNode和Secondary NameNode。下面咱們分別介紹這四個組成部分。架構
Client:就是客戶端併發
- 文件切分。文件上傳 HDFS 的時候,Client 將文件切分紅 一個一個的Block,而後進行存儲
- 與 NameNode 交互,獲取文件的位置信息
- 與 DataNode 交互,讀取或者寫入數據
- Client 提供一些命令來管理 HDFS,好比啓動或者關閉HDFS
- Client 能夠經過一些命令來訪問 HDFS
NameNode:就是 master,它是一個主管、管理者app
- 管理 HDFS 的名稱空間
- 管理數據塊(Block)映射信息
- 配置副本策略
- 處理客戶端讀寫請求
DataNode:就是Slave。NameNode 下達命令,DataNode 執行實際的操做框架
- 存儲實際的數據塊
- 執行數據塊的讀/寫操做
- 按期向NameNode發送心跳消息
Secondary NameNode:並不是 NameNode 的熱備。當NameNode 掛掉的時候,它並不能立刻替換 NameNode 並提供服務分佈式
- 輔助 NameNode,分擔其工做量
- 按期合併 fsimage和fsedits,並推送給NameNode
- 在緊急狀況下,可輔助恢復 NameNode
HDFS 如何讀取文件?
- 首先調用FileSystem對象的open方法,其實獲取的是一個DistributedFileSystem的實例。
- DistributedFileSystem經過RPC(遠程過程調用)得到文件的第一批block的locations,同一block按照重複數會返回多個locations,這些locations按照Hadoop拓撲結構排序,距離客戶端近的排在前面。
- 前兩步會返回一個FSDataInputStream對象,該對象會被封裝成 DFSInputStream對象,DFSInputStream能夠方便的管理datanode和namenode數據流。客戶端調用read方 法,DFSInputStream就會找出離客戶端最近的datanode並鏈接datanode。
- 數據從datanode源源不斷的流向客戶端。
- 若是第一個block塊的數據讀完了,就會關閉指向第一個block塊的datanode鏈接,接着讀取下一個block塊。這些操做對客戶端來講是透明的,從客戶端的角度來看只是讀一個持續不斷的流。
- 若是第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,而後繼續讀,若是全部的block塊都讀完,這時就會關閉掉全部的流。
HDFS 如何寫入文件?
- 客戶端經過調用 DistributedFileSystem 的create方法,建立一個新的文件。
- DistributedFileSystem 經過 RPC(遠程過程調用)調用 NameNode,去建立一個沒有blocks關聯的新文件。建立前,NameNode 會作各類校驗,好比文件是否存在,客戶端有無權限去建立等。若是校驗經過,NameNode 就會記錄下新文件,不然就會拋出IO異常。
- 前兩步結束後會返回 FSDataOutputStream 的對象,和讀文件的時候類似,FSDataOutputStream 被封裝成 DFSOutputStream,DFSOutputStream 能夠協調 NameNode和 DataNode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小packet,而後排成隊列 data queue。
- DataStreamer 會去處理接受 data queue,它先問詢 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode裏,好比重複數是3,那麼就找到3個最適合的 DataNode,把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中,第一個 DataNode又把 packet 輸出到第二個 DataNode 中,以此類推。
- DFSOutputStream 還有一個隊列叫 ack queue,也是由 packet 組成,等待DataNode的收到響應,當pipeline中的全部DataNode都表示已經收到的時候,這時akc queue纔會把對應的packet包移除掉。
- 客戶端完成寫數據後,調用close方法關閉寫入流。
- DataStreamer 把剩餘的包都刷到 pipeline 裏,而後等待 ack 信息,收到最後一個 ack 後,通知 DataNode 把文件標示爲已完成。
數據管理策略
1. 數據塊副本,數據分佈在不一樣DataNode和不一樣機架上,提升容錯率oop
2. 心跳檢測大數據
3. 二級NameNodespa