Java大數據之路--HDFS詳解(2)--技術細節

HDFS(分佈式文件存儲系統)--技術細節

目錄

HDFS(分佈式文件存儲系統)--技術細節

一、HDFS架構

二、Block

三、NameNode

四、副本放置策略

五、機架感知策略

六、DataNode

七、SecondaryNameNode


一、HDFS架構

  1. HDFS中,存儲數據的時候會將數據進行切塊,每一個塊稱之爲Block
  2. 本身是一個分佈式的,可擴展,可靠的文件系統
  3. HDFS中包含三個主要的進程:NameNode(用於管理節點和記錄元數據),DataNode(用於存儲數據),SecondaryNameNode。這三個進程一般是分佈式不同的主機上,所以一般習慣上是用進程的名字稱呼節點
  4. HDFS會對數據自動備份兩次,稱之爲副本(replication)。如果不指定,默認情況下副本數量爲3(額外複製兩次,加上原來的構成3個副本)

 

二、Block

  1. 在HDFS中,數據都是以Block爲單位進行存儲的
  2. 默認情況下,Hadoop1.0中的Block的大小是64M,Hadoop2.0中的Block的大小是128M,通過dfs.blocksize來調節大小
  3. 如果一個文件不足一個Block大小,則這個文件整體作爲一個Block存儲,並且Block大小和文件大小是一致的
  4. 切塊的優點:
    1. 文件塊可以保存在不同的節點上,能夠存儲超大文件
    2. 有利於數據的複製,便於快速備份(把大文件拆分開來,分節點複製)
  5. 一個塊(Block)的不同副本一定在不同節點上,不同Block的副本可能在一個節點上

三、NameNode

  1. NameNode是HDFS的核心節點,用於管理DataNode以及存儲元數據
  2. NameNode維護HDFS中的元數據信息:
    1. 文件的存儲路徑
    2. 文件權限
    3. 文件大小和Block大小信息
    4. BlockID
    5. Block和DataNode(節點)之間的關係信息
    6. 副本數量
    7. 元數據格式參照:FileName replicas block-Ids id2host。例如: /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
  3. 每一條元數據大概是150B大小
  4. NameNode會將元數據存儲在內存以及磁盤中:
    1. 存儲在內存中的目的是爲了快速查詢
    2. 存儲在磁盤中是爲了崩潰恢復
  5. 元數據信息會持久化到NameNode節點的硬盤上,持久化目錄的路徑是由core-site.xml的dfs.tmp.dir屬性來決定的。此參數如果不配置,默認是放在/tmp

  6. 存儲元數據的目錄:dfs/name/current

  7. 持久化文件包括:
    1. fsimage:元數據鏡像文件。存儲某NameNode元數據信息,並不是實時同步內存中的數據。一般而言,fsimage中的元數據是落後於內存中的元數據的
    2. edits:操作日誌文件,記錄了NameNode所要執行的操作
  8. NameNode在接收到寫操作時,先把這條命令記錄到edits中,再更改內存中的元數據,更改成功給Client返回成功信號,不會實時記錄到fsimage中,而需要達到一定條件在進行更新,所以fsimage往往是落後於內存中的元數據的,這樣設計的目的是爲了保證操作的可靠-只要記錄成功了,這個操作就一定會執行。
  9. 當內存中數據越來越多,fsimage一直沒有更新會導致數據差異越來越大,當fsimage進行更新的時候,他是將edits文件中的操作一一取出,重新執行到fsimage中。此時edits_inprogress會滾動成edits文件,同時生成一個新的edits_inprogress用於記錄新操作。
  10. fsimage更新和edits滾動觸發條件:
    1. 空間:當edits文件達到指定大小(默認是64M,這個大小可以通過fs.checkpoint.size----core-site.xml來調節)的時候,會觸發edits文件的滾動。
    2. 時間:當距離上次滾動間隔指定時間(默認是3600S,這個時間可以通過fs.checkpoint.period來調節-----core-site.xml)之後,會觸發edits文件的滾動。
    3. 重啓:當NameNode重啓的時候,會觸發滾動。
    4. 強制:通過hadoop dfsadmin -rollEdits命令來強制edits文件滾動。
  11. DataNode會通過RPC心跳機制來向NameNode註冊管理---DataNode會定時(每隔3S)的發送心跳信息給NameNode。
  12. 心跳信息:
    1. 當前DataNode中的Block信息
    2. 當前DataNode的狀態(預服役,服役,預退役,退役(節點不能發送退役狀態,前面三種都能發送))
  13. NameNode如果在10min沒有收到DataNode的心跳,則認爲這個DataNode已經lost,會將這節點上的數據(在其他節點上的副本)備份放到其他節點上,保證整個集羣中的副本數量
  14. NameNode重新啓動之後,進行fsimage文件的更新/edits文件的滾動,將fsimage文件中的內容加載到內存中,等待DataNode的心跳,如果在指定的時間內沒有等到心跳,則認爲這個DataNode已經丟失需要對應處理,如果等到了心跳那麼NameNode對DataNode的數據進行校驗,校驗DataNode中的數據和元數據記錄是否一致,如果校驗失敗,則會試圖去恢復這個數據。恢復之後會再次校驗。如果校驗成功則對外提供服務,不然只對外提供讀服務。---------這個過程稱之爲安全模式(safe mode)
  15. 在安全模式中,HDFS集羣只對外提供讀服務。
  16. 也正因爲有安全模式的校驗問題,所以要求副本數量不能多於節點數量。
  17. 如果在合理的時間內,集羣沒有自動退出安全模式,那麼可能就已經產生了數據丟失,並且這個數據不可恢復。
  18. 強制退出安全模式:hadoop dsfadmin -safemode leave
  19. 參考資料

四、副本放置策略

  1. 第一個副本:
    1. 如果是集羣內部上傳,誰上傳第一個副本就在誰身上。
    2. 如果是集羣外部上傳,則第一個副本會放在相對空閒的節點上。
  2. 第二個副本:
    1. Hadoop2.7之前:第二個副本是放在和第一個副本不同機架(防止整個機架都宕機)的節點上
    2. Hadoop2.7開始:第二個副本是放在和第一個副本同一個機架(機架內部傳輸快)節點上
  3. 第三個副本:
    1. Hadoop2.7之前:第三個副本是放在和第二個副本同一個機架(機架內部傳輸快)節點上
    2. Hadoop2.7開始:第三個副本是放在和第二個副本不同機架(防止整個機架都宕機)的節點上
  4. 更多副本:
    1. 誰閒放在誰身上

五、機架感知策略

  1. 所謂的機架不是物理機架而是邏輯機架,本質上就是一個映射
  2. 可以將不同物理機架的節點映射到同一個邏輯機架上
  3. 實際過程中會將同一個物理機架的節點去映射到同一個邏輯機架上

六、DataNode

  1. 存儲Block
  2. DataNode給NameNode發送心跳
  3. 存儲Block的路徑也是由hadoop.tmp.dir屬性中修改

七、SecondaryNameNode

  1. SecondaryNameNode並不是NameNode的備份,這個節點作用是輔助NameNode完成edits文件的滾動
  2. 在完全分佈式中,一旦出現SecondaryNameNode,則edits文件的滾動是在SecondaryNameNode上進行;如果沒有SecondaryNameNode,則edits文件的滾動由NameNode自己完成
  3. 在HDFS集羣中,只能採取NameNode+SecondaryNameNode結構或者是雙NameNode結構,因爲SecondaryNameNode的作用可以被NameNode取代,但是NameNode作爲核心節點如果只有1個容易出現單點故障,所以實際過程中往往會捨棄SecondaryNameNode採用雙NameNode結構來構成NameNode的HA(高可用)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章