HDFS架構及文件讀寫流程

HDFS是Hadoop的組件之一,是一個分佈式文件系統, 文件系統是一個抽象類,其中有不少的子實現類,例如:hdfs,file:\(本地磁盤),ftp文件系統,webHdfs(可經過瀏覽器的界面進行文件操做).node

1.架構圖web

在这里插入图片描述

  (1)HDFSClient:客戶端想要請求數據,首先對NameNode進行"詢問",NameNode會將數據的存儲信息返回給用戶.數據庫

  (2) NameNode :保存HDFS元數據的信息(存儲在內存中,磁盤),負責管理文件系統的名字空間(namespace)以及客戶端對文件的訪問.瀏覽器

  (3)Secondary NameNode:主機元數據的輔助管理緩存

  (4) DateNode:存儲數據安全

  (5) Heartbeats: NameNode和DateNode之間存在心跳機制.DateNode會按期向NameNode報告本身是否還"活着".NameNode全權管理數據庫的複製,它週期性的從集羣中的每一個DataNode接收心跳信合和狀態報告,接收到心跳信號意味着DataNode節點工做正常,塊狀態報告包含了一個該DataNode上全部的數據列表.服務器

  (6) Blancing:負載均衡網絡

  (7) Replication:副本機制,副本存放在哪些Datanode上由NameNode來控制,根據全局狀況做出塊放置決定,讀取文件時NameNode儘可能讓用戶先讀取最近的副本,下降讀取網絡開銷和讀取延時.默認設置3個副本多線程

2.HDFS的block塊存儲架構

     HDFS數據塊:HDFS上的文件被劃分爲塊大小的多個分塊,做爲獨立的 存儲單元,稱爲數據塊,在hadoop1當中,文件的block塊默認大小是64M,hadoop2當中,文件的block塊大小默認是128M,block塊的大小能夠經過hdfs-site.xml當中的配置文件進行指定.

    2.1 抽象塊好處:

(1)一個文件的大小能夠大於集羣任意節點磁盤的容量
(2)容易對數據進行備份,提升容錯能力
(3)使用抽象塊概念而非整個文件做爲存儲單元,大大簡化存儲子系統的設計

    2.2 塊緩存

    將block塊存儲到內存中,在執行一些MR計算時,能夠從內存中獲取,比較快,比較使用於小表join大表的狀況.

3.HDFS的元數據信息管理

      當namenode就一個的時候,全部的元數據信息都保存在了FsImage與Eidts文件當中,這兩個文件就記錄了全部的數據的元數據信息,元數據信息的保存目錄配置在了hdfs-site.xml當中.

    3.1 介紹

      (1) FsImage:是namenode中關於元數據的鏡像,通常稱爲檢查點。存放的是一份完整的元數據信息,內容較大.
      (2) Edits:元數據操做日誌,記錄了一段時間的元數據信息變化狀況. 隨着edits內容增大,就須要在必定時間點和fsimage合併。
      (3) SecondaryNameNode:主要職責合併edits和fsImage,清空edits.

   3.2 edits和fsImage合併的控制策略:

       SecondaryNameNode按期檢查edits文件,一旦觸發合併條件(時間長短(fs.checkpoint.period: 默認是一個小時(3600s))+文件大小(fs.checkpoint.size: 默認64MB))

    1)secondaryNameNode通知NameNode準備切換edits文件.
    2)NameNode接收到切換通知,全部的操做通知寫入到新的edits文件中.
    3)secondaryNameNode獲取edits和fsImage兩個文件,一次性將兩個文件加載到內存中,合併成爲新的fsImage.
    4)secondaryNameNode將新的fsImage發送給NameNode替換掉原有舊的fsImage.

4.HDFS文件寫入

在这里插入图片描述
詳細步驟:
      一、 client發起文件上傳請求,經過RPC與NameNode創建通信,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否能夠上傳;
      二、 client請求第一個block該傳輸到哪些DataNode服務器上;
      三、 NameNode根據配置文件中指定的備份數量及機架感知原理進行文件分配,返回可用的DataNode的地址如:A,B,C;

注:Hadoop在設計時考慮到數據的安全與高效,數據文件默認在HDFS上存放三份,存儲策略爲本地一份,同機架內其它某一節點上一份,不一樣機架的某一節點上一份。
      四、 client請求3臺DataNode中的一臺A上傳數據(本質上是一個RPC調用,創建pipeline),A收到請求會繼續調用B,而後B調用C,將整個pipeline創建完成,後逐級返回client;
      五、 client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet爲單位(默認64K),A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答。
      六、 數據被分割成一個個packet數據包在pipeline上依次傳輸,在pipeline反方向上,逐個發送ack(命令正確應答),最終由pipeline中第一個DataNode節點A將pipelineack發送給client;
      七、 當一個block傳輸完成以後,client再次請求NameNode上傳第二個block到服務器。

  5.HDFS文件讀取

讀取時能夠經過多線程的方式去讀取block塊,提升讀取的效率.

詳細步驟:       一、 Client向NameNode發起RPC請求,來肯定請求文件block所在的位置;       二、 NameNode會視狀況返回文件的部分或者所有block列表,對於每一個block,NameNode 都會返回含有該 block 副本的 DataNode 地址; 這些返回的 DN 地址,會按照集羣拓撲結構得出 DataNode 與客戶端的距離,而後進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時彙報的 DN 狀態爲 STALE,這樣的排靠後;       三、 Client 選取排序靠前的 DataNode 來讀取 block,若是客戶端自己就是DataNode,那麼將從本地直接獲取數據(短路讀取特性);       四、 底層上本質是創建 Socket Stream(FSDataInputStream),重複的調用父類 DataInputStream 的 read 方法,直到這個塊上的數據讀取完畢;       五、 當讀完列表的 block 後,若文件讀取尚未結束,客戶端會繼續向NameNode 獲取下一批的 block 列表;       六、 讀取完一個 block 都會進行 checksum 驗證,若是讀取 DataNode 時出現錯誤,客戶端會通知 NameNode,而後再從下一個擁有該 block 副本的DataNode 繼續讀。       七、 read 方法是並行的讀取 block 信息,不是一塊一塊的讀取;NameNode 只是返回Client請求包含塊的DataNode地址,並非返回請求塊的數據;       八、 最終讀取來全部的 block 會合併成一個完整的最終文件。 ---------------------  做者:人間怪物  來源:CSDN  原文:https://blog.csdn.net/qq_41975699/article/details/84928531 

相關文章
相關標籤/搜索