淺談hdfs架構與數據流

概述

  隨着數據量愈來愈大,在一個操做系統管轄的範圍內存不下了,那麼就分配到更多的操做系統管理的磁盤中,可是不方便管理和維護,迫切須要一種系統來管理多臺機器上的文件,這就是分佈式文件管理系統。HDFS只是分佈式文件管理系統中的一種。node

  HDFS,它是一個文件系統,用於存儲文件,經過目錄樹來定位文件;其次,它是分佈式的,由不少服務器聯合起來實現其功能,集羣中的服務器有各自的角色。HDFS的設計適合一次寫入,屢次讀出的場景,且不支持文件的修改。適合用來作數據分析,並不適合用來作網盤應用。緩存

HDFS架構

這種架構主要由四個部分組成,分別爲HDFS Client、NameNode、DataNode和Secondary NameNode。
下面咱們分別介紹這四個組成部分。
複製代碼

Client客戶端

  • 文件切分。文件上傳HDFS的時候,Client將文件切分紅一個一個的Block,而後進行存儲。
  • NameNode交互,獲取文件的位置信息。
  • DataNode交互,讀取或者寫入數據。
  • Client提供一些命令來管理HDFS,好比啓動或者關閉HDFS。
  • Client能夠經過一些命令來訪問HDFS

NameNode

就是master,它是一個主管、管理者
複製代碼
  • 管理HDFS的名稱空間。
  • 管理數據塊Block映射信息
  • 配置副本策略
  • 處理客戶端讀寫請求。

DataNode

就是Slave,NameNode下達命令,DataNode執行實際的操做
複製代碼
  • 存儲實際的數據塊。
  • 執行數據塊的讀/寫操做。

Secondary NameNode

並不是NameNode的熱備,當NameNode掛掉的時候,它並不能立刻替換NameNode並提供服務
複製代碼
  • 輔助NameNode,分擔其工做量。
  • 按期合併FsimageEdits,並推送給NameNode
  • 在緊急狀況下,可輔助恢復NameNode

關於HDFS文件塊大小

HDFS中的文件在物理上是分塊存儲(block),塊的大小能夠經過配置參數( dfs.blocksize)來規定,
默認大小在hadoop2.x版本中是128M,老版本中是64M。

HDFS的塊比磁盤的塊大,其目的是爲了最小化尋址開銷。若是塊設置得足夠大,從磁盤傳輸數據的時間會明顯大於定位
這個塊開始位置所需的時間,於是,傳輸一個由多個塊組成的文件的時間取決於磁盤傳輸速率。 
  
若是尋址時間約爲10ms,而傳輸速率爲100MB/s,爲了使尋址時間僅佔傳輸時間的1%,
咱們要將塊大小設置約爲100MB。默認的塊大小128MB。塊的大小:10ms*100*100M/s = 100M
複製代碼

HDFS寫數據流程

  • 客戶端經過Distributed FileSystem模塊向namenode請求上傳文件,namenode檢查目標文件是否已存在,父目錄是否存在。
  • namenode返回是否能夠上傳。
  • 客戶端請求第一個block上傳到哪幾個datanode服務器上。
  • namenode返回3個datanode節點,分別爲dn一、dn二、dn3
  • 客戶端經過FSDataOutputStream模塊請求dn1上傳數據,dn1收到請求會繼續調用dn2,而後dn2調用dn3,將這個通訊管道創建完成。
  • dn1dn2dn3逐級應答客戶端。
  • 客戶端開始往dn1上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet爲單位,dn1收到一個packet就會傳給dn2dn2傳給dn3dn1每傳一個packet會放入一個應答隊列等待應答。
  • 當一個block傳輸完成以後,客戶端再次請求namenode上傳第二個block的服務器。(重複執行3-7步)

HDFS讀數據流程

  • 客戶端經過Distributed FileSystemnamenode請求下載文件,namenode經過查詢元數據,找到文件塊所在的datanode地址。
  • 挑選一臺datanode(就近原則,而後隨機)服務器,請求讀取數據。
  • datanode開始傳輸數據給客戶端(從磁盤裏面讀取數據輸入流,以packet爲單位來作校驗)。
  • 客戶端以packet爲單位接收,先在本地緩存,而後寫入目標文件。

NameNode & Secondary NameNode工做機制

  • 第一階段:namenode啓動
    • 第一次啓動namenode格式化後,建立fsimageedits文件。若是不是第一次啓動,直接加載編輯日誌和鏡像文件到內存。
    • 客戶端對元數據進行增刪改的請求。
    • namenode記錄操做日誌,更新滾動日誌。
    • namenode在內存中對數據進行增刪改查。
  • 第二階段:Secondary NameNode工做
    • Secondary NameNode詢問namenode是否須要checkpoint。直接帶回namenode是否檢查結果。
    • Secondary NameNode請求執行checkpoint
    • namenode滾動正在寫的edits日誌。
    • 將滾動前的編輯日誌和鏡像文件拷貝到Secondary NameNode
    • Secondary NameNode加載編輯日誌和鏡像文件到內存,併合並。
    • 生成新的鏡像文件fsimage.chkpoint
    • 拷貝fsimage.chkpointnamenode
    • namenodefsimage.chkpoint從新命名成fsimage

關於鏡像文件和編輯日誌文件

概念

namenode被格式化以後,將在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current目錄中產生以下文件:安全

edits_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION
複製代碼
  • Fsimage文件:HDFS文件系統元數據的一個永久性的檢查點,其中包含HDFS文件系統的全部目錄和文件idnode的序列化信息。
  • Edits文件:存放HDFS文件系統的全部更新操做的路徑,文件系統客戶端執行的全部寫操做首先會被記錄到edits文件中。
  • seen_txid文件保存的是一個數字,就是最後一個edits_的數字
  • 每次Namenode啓動的時候都會將fsimage文件讀入內存,並從00001開始到seen_txid中記錄的數字依次執行每一個dits裏面的更新操做,保證內存中的元數據信息是最新的、同步的,能夠當作Namenode啓動的時候就將fsimageedits文件進行了合併。

DataNode工做機制

  • 一個數據塊在datanode上以文件形式存儲在磁盤上,包括兩個文件,一個是數據自己,一個是元數據包括數據塊的長度,塊數據的校驗和,以及時間戳。
  • DataNode啓動後向namenode註冊,經過後,週期性(1小時)的向namenode上報全部的塊信息。
  • 心跳是每3秒一次,心跳返回結果帶有namenode給該datanode的命令如複製塊數據到另外一臺機器,或刪除某個數據塊。若是超過10分鐘沒有收到某個datanode的心跳,則認爲該節點不可用。
  • 集羣運行中能夠安全加入和退出一些機器。
相關文章
相關標籤/搜索