Hadoop學習筆記之HDFS

NO IMAGE

組成:

  • 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的報告,當數據塊達到最小副本數以上時,被認為是‘安全’的。
  • 當檢測到有副本數不足的數據塊時,該塊會被複制達到最小副本數

相關文章

React源碼Scheduler(二)React的調度流程

React源碼Scheduler(一)瀏覽器的調度

Redis持久化

redis的五種數據類型基本用法總結