Hadoop系列(二 ) HDFS原理分析史上最詳細,能和麪試官吹半個小時

@[TOC]

HDFS架構:

在這裏插入圖片描述

NameNode(NN):

  • 管理文件系統的namespace/元數據
  • 一個HDFS集羣只有一個Active的NN

說白了就是管理文件的目錄

它保存了兩個核心的數據結構: FslmageEditLog

  • FsImage負責維護文件系統樹和樹中所有文件和文件夾的元數據。
    ———維護文件結構和文件元信息的鏡像
  • EditLog操作日誌文件中記錄了所有針對文件的創建,刪除,重命名操作。
    ———記錄對文件的操作

    PS:
    1.NN的元數據爲了讀寫速度塊是寫在內存裏的,FsImage只是它的一個鏡像保存文件
    2.當每輸入一個增刪改操作,EditLog都會單獨生成一個文件,最後EL會生成多個文件
    3.2NN不是NN的備份(但可以做備份),它的主要工作是幫助NN合併edits log,減少NN啓動時間。
    4.拓撲距離:根據節點網絡構成的樹形結構計算最短路徑
    5.機架感知:根據拓撲距離得到的節點擺放位置

SecondaryNameNode(2NN):

  • 合併NameNode的editlogs和fsimage文件
  • 輔助NN將內存中元數據信息持久化

    DataNode(DN):

  • 數據存儲節點,保存和檢索Block
  • 一個集羣可以有多個數據節點

    ResourceManager(RM):

    它是負責管理機器中的內存、cpu的那個操作系統的調度系統

  • ResourceManager負責整個集羣的資源管理和分配,是一個全局的資源管理系統。
  • NodeManager以心跳的方式向ResourceManager彙報資源使用情況(目前主要是CPU和內存的使用情況)。RM只接受NM的資源回報信息,對於具體的資源處理則交給NM自己處理。
  • YARN Scheduler根據application的請求爲其分配資源,不負責application job的監控、追蹤、運行狀態反饋、啓動等工作。

NodeManager(NM):

  • NodeManager是每個節點上的資源和任務管理器,它是管理這臺機器的代理,負責該節點程序的運行,以及該節點資源的管理和監控。YARN集羣每個節點都運行一個NodeManager。
  • NodeManager定時向ResourceManager彙報本節點資源(CPU、內存)的使用情況和Container的運行狀態。當ResourceManager宕機時NodeManager自動連接RM備用節點。
  • NodeManager接收並處理來自ApplicationMaster的Container啓動、停止等各種請求。

HDFS具體工作原理:


一:NN——2NN(元數據節點工作原理)

在這裏插入圖片描述


第一步: 當客戶端對元數據進行增刪改請求時,由於hadoop安全性要求比較高,它會先將操作寫入到editlog文件裏先持久化


第二步: 然後將具體增刪改操作,將FSimage和edit寫入內存裏進行具體的操作,先寫文件,即使宕機了也可以恢復數據,不然先內存數據就會消失,此時2NN發現時間到了,或者edit數據滿了或者剛開機時,就會請求執行輔助操作,NN收到後將edit瞬間複製一份,這個時候客戶端傳過來的數據繼續寫到edit裏。


第三步:我們把複製的edit和fsimage拷貝到2NN裏,操作寫在2NN的內存裏合併,合併後將文件返回給NN做爲新的Fsimage。所以一旦NN宕機2NN比NN差一個edit部分,無法完全恢復原先狀態,只能說輔助恢復。

但是輔助Namenode總是落後於主Namenode,所以在Namenode宕機時,數據丟失是不可避免的。在這種情況下,一般的,要結合遠程掛載的網絡文件系統(NFS)中的Namenode的元數據文件來使用,把NFS中的Namenode元數據文件,拷貝到輔助Namenode,並把輔助Namenode作爲主Namenode來運行。
爲了讀寫速度,datanode的位置信息是存在namenode的內存裏的,不存硬盤,又因爲會擔心宕機,所以要備份一個fsimage,不斷傳數據,不斷備份又會產生一致性問題,節點斷電,數據丟失,所以採用editlog,延遲更新的方式,定期更新。但是定期更新這個操作由NN來做壓力會太大,效率會變低,所以引入2NN來輔助。

通常,SecondaryNamenode 運行在一個單獨的物理機上,因爲合併操作需要佔用大量的CPU時間以及和Namenode相當的內存

namenode的fsimage並不永久保存塊的位置信息,因爲這些信息在系統啓動時由數據節點重建


NN—DN(數據存取原理)

二:HDFS讀文件流程:

第一步: 首先調用FileSystem.open()方法,獲取到DistributedFileSystem實例。


第二步: DistributedFileSystem 向Namenode發起RPC(遠程過程調用)請求獲得文件的開始部分或全部block列表,對於每個返回的塊,都包含塊所在的DataNode地址。


> 這些DataNode會按照Hadoop定義的集羣拓撲結構得出客戶端的距離,然後再進行排序。如果客戶端本身就是一個DataNode,那麼他將從本地讀取文件。

第三步: DistributedFileSystem會向客戶端client返回一個支持文件定位的輸入流對象FSDataInputStream,用於客戶端讀取數據。


第四步: FSDataInputStream包含一個DFSInputStream對象,這個對象用來管理DataNode和NameNode之間的I/O


第五步: 客戶端調用read()方法,DFSInputStream就會找出離客戶端最近的datanode並連接datanode


第六步: DFSInputStream對象中包含文件開始部分的數據塊所在的DataNode地址,首先它會連接包含文件第一個塊最近DataNode。隨後,在數據流中重複調用read()函數,直到這個塊全部讀完爲止。如果第一個block塊的數據讀完,就會關閉指向第一個block塊的datanode連接,接着讀取下一個block塊。


第七步: 如果第一批block們都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然後繼續讀,如果所有的block塊都讀完,這時就會關閉掉所有的流。read 方法是並行的讀取 block 信息,不是一塊一塊的讀取。

NameNode 只是返回Client請求包含塊的DataNode地址,並不是返回請求塊的數據。


第八步: 最終讀取來所有的 block 會合併成一個完整的最終文件。


三:HDFS寫文件流程:


第一步: 客戶端通過調用 DistributedFileSystem 的create方法,創建一個新的文件。


第二步: DistributedFileSystem 通過 RPC(遠程過程調用)調用 NameNode,去創建一個沒有blocks關聯的新文件。


第三步: 創建前,NameNode 會做各種校驗,比如文件是否存在客戶端有無權限去創建等。如果校驗通過,NameNode 就會記錄下新文件,否則就會拋出IO異常。


第四步: NameNode 返回請求成功 的信息後,客戶端將文件邏輯分塊成數個部分,通過FSDataOutputStream對象,將DataNode寫入數據,數據首先被寫入FSDataOutputStream對象內部的buffer中,FSDOutputStream 會把數據切成一個個小packet(64k) FSDOutputStream 負責處理namenode和datanode之間的通信。客戶端開始寫數據FSDOutputStream,,然後排成隊列 data queue。 使用管道與 切割成packet的理由 :並行存儲,增加效率


第五步: 輸出流 會去處理接受 data queue,它先詢問 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode裏,比如重複數是3,通過計算拓撲距離,進行機架感知,完成3個datanode節點最合適存儲位置尋找。把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中,第一個 DataNode的內存buffer接收到packet將其持久化同時又把 packet 輸出到第二個 DataNode 中,以此類推。


第六步: DFSOutputStream 還有 一個隊列叫 ack queue ,也是由 packet 組成,等待DataNode的收到響應,當pipeline中的所有DataNode都表示已經收到的時候,這時akc queue纔會把對應的packet包移除掉。這組datanode組成的pipeline反方向上,發送ack成功信號,最終由pipeline中第一個datanode節點將pipelineack發送給client,並close關閉掉流,client將成功信息傳給namenode,namenode將其對應元數據信息保存下來。


第七步: 繼續讀接下來的剩下來的塊,namenode 再會分配三個節點的位置,以此類推,直至寫完。


HDFS具體應用:

HDFS CLI (命令行)

基本格式:
  • hdfs dfs +….
  • hadoop fs (已過時)
命令:
  • -ls: hdfs dfs -ls /mydemo

  • -cat:hdfs dfs -ls /mydemo/niceday.txt

  • -put:hdfs dfs -put /opt/soft/niceday.txt /mydemo

  • mkdir:hdfs dfs -mkdir /mydemo

  • -text:hdfs dfs -ls /mydemo/niceday.txt

  • -get:hdfs dfs -get /mydemo/niceday.txt /opt

  • rm /rm-R:hdfs dfs -rm /mydemo/niceday.txt


HDFS優缺點:


HDFS優點:

  • 支持處理超大文件
  • 可運行廉價機器上
  • 容錯性
  • 流式文件寫入

HDFS缺點:——不合適實時

  • 不適合低延時數據訪問場景。
  • 不適合小文件存取場景——佔用NN大量內存,尋找時間超過讀取時間
  • 不適合併發寫入,文件隨機修改場景。

HDFS小細節:

HDFS副本機制:
  • block數據塊128M的原因:

    • HDFS平均尋址時間大概爲10ms

    • 大量測試發現尋址時間爲傳輸時間的1%,爲最佳狀態

    • 目前磁盤傳輸100MB/s,計算出最佳大小:100MB/s * 1 = 100MB

      再經過cpu讀取固定是2的整數次冪,所以我們將塊設定爲128MB

  • block數據塊過大: 磁盤讀寫時間過長,易被誤判成失效節點

  • block數據塊過小:
    • 文件過於碎片化,namenode浪費大量內存
    • 元數據信息過多,增加尋址時間

  • 副本數默認爲3

  • 存放機制:

    • 一個在本地機架節點
    • 一個在同一個機架不同節點
    • 一個在不同機架的節點
HDFS的文件夾的作用:
  • log:錯誤在logs上找

  • share :jar包和幫助文檔所在地

  • tmp/dfs/data: 裏存有datanode的版本號,uuid來確認時本機的datanode

  • tmp/dfs/name : 裏存有namenode的版本號,他們的集羣id是一樣的,還存着fsimage和edit

  • tmp/dfs/name: 裏存有secondnamenode的版本號,,還存着fsimage和edit

HDFS高可用:(High Availability)
  • 2.x版本
    • 解決:HDFS Federation方式,共享DN資源
    • Active Namenode
      • 對外提供服務
    • Standby namenode
      • active故障時切換爲active
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章