組成:
- nameNode:
- 存儲元數據(文件名,大小,類型等信息)
- 元數據保存在磁盤中,啓動時加載到內存
- 保存文件,block,dataNode之間的映射關係
- dataNode:
- 存儲文件內容
- 文件內容保存在磁盤
- 維護了blockId到dataNode本地文件的映射關係
運行機制:
- 一個nameNode, 多個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份副本。linux
NameNode(NN)
- 主要功能:接受client的讀寫請求
- 保存信息包括:
- 文件全部人,權限,
- 文件包含哪些block,
- block保存在哪一個dataNode上(dataNode啓動時上報給nameNode)
- nameNode的元數據(metadata)啓動後加載到內存
- metadata存儲在磁盤的文件名是fsimage
- block位置信息不會存fsimage(啓動時上報而後加載到內存)
- edits目錄記錄對metadata的操做日誌。好比,當有新增刪除操做時,會更新內存中的metadata,但並不會立刻更新fsimage,而是記錄一條日誌,隔一段時間以後再合併到fsimage中。
SecondaryNameNode(SNN)
-
並非nameNode的備份,但能夠作一部分的元數據的備份api
-
主要功能:幫助nameNode合併edits文件安全
-
合併時機:併發
- 根據設置的時間間隔fs.checkpoint.period 默認3600s
- 根據設置的edits log大小fs.checkpoint.size 默認64MB
-
合併流程:SNN將NN的edits和fsimage拷貝過來,進行合併。而後將新生成的fsimage傳輸到NN替換舊的fsimage。爲了保證數據不丟失,在SNN拷貝edits的時候,NN已經啓用了新的edits。如此輪迴反覆。oop
-
在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的報告,當數據塊達到最小副本數以上時,被認爲是‘安全’的。
- 當檢測到有副本數不足的數據塊時,該塊會被複制達到最小副本數