Hadoop學習筆記之HDFS

組成:

  • 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份副本。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的報告,當數據塊達到最小副本數以上時,被認爲是‘安全’的。
  • 當檢測到有副本數不足的數據塊時,該塊會被複制達到最小副本數
相關文章
相關標籤/搜索