目錄
組成:
- nameNode:
- 存儲元數據(文件名,大小,類型等信息)
- 元數據保存在磁盤中,啟動時加載到內存
- 保存文件,block,dataNode之間的映射關係
- dataNode:
- 存儲文件內容
- 文件內容保存在磁盤
- 維護了blockId到dataNode本地文件的映射關係
運行機制:
- 一個nameNode, 多個dataNode
- 數據複製【副本機制】
- 故障檢測
- dataNode是否宕機
- 數據是否完整
- 空間回收機制
優點
- 高容錯性
- 數據自動保存多個副本
- 副本丟失後自動恢復
- 適合大數據
- TB 甚至PB級別的數據
- 百萬規模以上的文件數量
- 10K+ 節點
- 可構建在廉價機器上
- 通過對歌副本提高可靠行
- 提供了容錯和恢復機制
缺點
- 低延遲數據訪問
- 比如毫秒級
- 低延遲與高吞吐量
- 大量小文件存儲
- 佔用大量的nameNode內存
- 尋道時間超過讀取時間
- 併發寫入,文件隨機修改
- 文件放在hdfs後不方便修改(修改內容)
- 一個文件不能有多個寫入者
數據存儲單元(block)
- 文件被切割成固定大小的數據塊,默認每個塊是64MB,可配
- 若文件不足64MB, 也單獨存一個block;一個block只存一個文件,但一個文件可能存多個block。
- block是邏輯概念,不是物理結構,即文件實際多大就佔用多大的磁盤空間。
- 默認每個數據存兩個副本(共三份數據),可配。
- 副本數和塊的大小通過client上傳時設置。文件上傳成功後,副本數可修改,塊的大小不可修改。
設計思想
一個文件,以70MB為例,將被切分成兩個數據塊(64MB和6MB),每個block存三份在不同的節點(dataNode)上。 當有一個dataNode掛掉,hdfs會發現某個block的副本數 < 3,這時會找到另外的一個副本,複製一份,然後存在其他空閒的dataNode上,這時副本數又恢復到3份副本。
NameNode(NN)
- 主要功能:接受client的讀寫請求
- 保存信息包括:
- 文件所有人,權限,
- 文件包含哪些block,
- block保存在哪個dataNode上(dataNode啟動時上報給nameNode)
- nameNode的元數據(metadata)啟動後加載到內存
- metadata存儲在磁盤的文件名是fsimage
- block位置信息不會存fsimage(啟動時上報然後加載到內存)
- edits目錄記錄對metadata的操作日誌。比如,當有新增刪除操作時,會更新內存中的metadata,但並不會馬上更新fsimage,而是記錄一條日誌,隔一段時間之後再合併到fsimage中。
SecondaryNameNode(SNN)
並不是nameNode的備份,但可以做一部分的元數據的備份
主要功能:幫助nameNode合併edits文件
合併時機:
- 根據設置的時間間隔fs.checkpoint.period 默認3600s
- 根據設置的edits log大小fs.checkpoint.size 默認64MB
合併流程:SNN將NN的edits和fsimage拷貝過來,進行合併。然後將新生成的fsimage傳輸到NN替換舊的fsimage。為了保證數據不丟失,在SNN拷貝edits的時候,NN已經啟用了新的edits。如此輪迴反覆。
在NN掛了之後,SNN還保留著上次備份完成時的fsimage, 所以,可以恢復大部分數據。
由此可見,內存中的元數據,和fsimage有一定的差異,元數據是實時的,fsimage不是。
DataNode(DN)
- 存儲數據(block)
- 啟動時會向NN彙報block信息
- 通過向NN發送心跳保持聯繫(3s一次),如果NN十分鐘沒有收到DN的心跳,則認為DN已經lost,並複製其上的block到其他的DN
Block副本放置的策略
- 第一個副本:放置在上傳文件的DN
- 第二個副本:放置在和第一個副本不同的機架的節點上
- 第三個副本:放置在和第二個副本相同的機架上的節點上
- 更多副本:隨機節點
HDFS讀數據流程
- client通過DistributedFileSystem請求NN,獲得block的位置信息
- client請求FSDataInputStream,通過這個api,併發地讀取DN上的各個block
- client合併成一個完整的文件
HDFS寫數據流程
- client通過DistributedFileSystem請求NN, 創建元數據(文件名,大小,所有人),NN返回數據應該切多少個block,應該存在哪些DN
- client通過FSDataOutputStream往其中一個DN寫入數據,產生一個副本
- 再由這個DN產生一個線程,往其他的DN上覆制副本,返回成功信息
- client再往NN發信息告訴NN, 文件上傳完了。
HDFS文件權限
- 與linux文件權限類似,rwx
- x 對於文件忽略,對於文件夾表示是否允許訪問其內容
- 如果linux用戶zhangsan,使用hadoop命令創建了一個文件,那麼文件在hdfs的所有人就是zhangsan
- 不做密碼認證,告訴我你是誰我就相信你是誰。做密碼認證會降低數據讀寫的速度,所以適合存安全性不是很高的數據
安全模式(初始化階段)
- NN啟動時,首先將fsimage加載到內存,並執行edits的各項操作;
- 一旦內存中成功形成元數據,將生成一個新的fsimage和一個空的edits。就是好比自己做了一遍SNN的工作。
- 此時的hdfs對於client而言是隻讀的。
- 此階段,NN收集各個DN的報告,當數據塊達到最小副本數以上時,被認為是‘安全’的。
- 當檢測到有副本數不足的數據塊時,該塊會被複制達到最小副本數