HDFS-001-瞭解

hadoop的思想就是把一個文件劃分爲N個block,然後把block散列到不同機器上。

因此block塊的大小設定就非常重要了

大數據運算的結論:

1.分治思想

2.並行計算

3.計算向數據移動(減少傳輸IO消耗的時間  數據移動比分佈式計算更耗時)

4.數據本地化讀取

這四個條件將是整個大數據技術需要關心的重點

  1. 什麼是HDFS?

HDFS( Hadoop Distributed File System)是一個分佈式文件系統

  1. 什麼是分佈式文件系統呢?

簡單說就是一個文件用N個block存儲,單機情況就是一個文件存儲在一臺計算,而分佈式文件系統就是把這N個block存儲到不同的機器上

  1. 市上有很多分佈式文件系統,爲什麼Hadoop還要自己開發HDFS?
  1. HDFS具有高度的容錯性,可部署在低成本硬件上。非常適合高吞吐量、大型數據集的應用程序
  2. HDFS放寬了POSIX的一些要求,以支持對文件系統數據的流式訪問
  3. 通常最好將計算遷移到數據所在的位置,而不是將數據移動到應用程序運行的位置
  1. 容錯

故障檢測和快速、自動地從中恢復是HDFS的核心架構目標

  1. 存儲模型

  1. 文件線性按字節切割成塊(block),具有offset,id
  2. 文件與文件的block大小可以不一樣,一個文件=N個block
  3. 一個文件除最後一個block,其他block大小一致
  4. block的大小依據硬件的I/O特性調整(屬於操作系統基本的優化)
  5. block被分散存放在集羣的節點中,具有location
  6. Block具有副本(replication),沒有主從概念,副本不建議在同一個節點
  7. 副本是滿足可靠性和性能的關鍵
  8. 文件上傳可指定block大小和副本數,上傳後只能修改副本數
  9. 一次寫入多次讀取,不支持修改,但可以追加和截斷
  10. 支持追加數據
  1. 架構設計

  1. HDFS是一個主從(Master/Slaves)架構
  2. 由一個NameNode和N個DataNode組成
  3. 面向文件包含:文件數據(data)和文件元數據(metadata)
  4. NameNode負責存儲和管理文件元數據,並維護了一個層次型的文件目錄樹
  5. DataNode負責存儲文件數據(block塊),並提供block的讀寫
  6. DataNode與NameNode維持心跳,並彙報自己持有的block信息
  7. Client和NameNode交互文件元數據和DataNode交互文件block數據
  1. 數據複製

  1. 在任何時候都只有一個writer。
  2. NameNode做出關於塊複製的所有決定。它週期性地從集羣中的每個數據節點接收心跳和Blockreport。接收到心跳信號意味着數據節點工作正常。Blockreport包含數據節點上所有塊的列表。
  3. NameNode角色功

 

                1. 基於內存存儲文件、目錄結構,文件block的映射

                2.需要持久化方案保證數據的可靠性

                3. 提供副本放置策略

  1. DataNode角色功能
    1. 基於本地磁盤存儲block(文件的形式)
    2. 保存block的校驗和數據保證block的可靠性
    3. 與NameNode保持心跳,彙報block列表狀態
  1. 元數據持久化

  1. 任何對文件系統元數據產生修改的操作,NameNode都會生成一個EditLog的事務進行記錄下來
  2. 使用FsImage存儲所有元數據的狀態
  3. 使用本地磁盤保存EditLog和FsImage
  4. EditLog具有完整性,數據丟失少,但恢復速度慢,並且膨脹風險(日誌文件太大)
  5. FsImage具有恢復速度快,提及與內存數據相當,但不能實時保存,數據丟失多
  6. NameNode使用了FsImage+EditLog整合方案:

 滾動將增量的EditLog更新到FsImage,以保證更近時點的FsImage和更小的EditLog體積

Ps

  1. EditsLog:恢復日誌,可用於恢復數據
  2. FsImage:鏡像,可用於快照恢復數據
  3. HDFS採用FsImage+增量的EditLog進行記錄避免數據丟失

 

  1. 安全模式

  1. HDFS搭建時會格式化,格式化操作會產生一個空的FsImage
  2. 當NameNode啓動時,它從磁盤中讀取EditLog和FsImage
  3. 將所有EditLog中的事務作用在內存中的FsImage上
  4. 並且將新版本的FsImage從內存中保存在磁盤上
  5. 刪除舊的EditLog,因爲這個舊的EditLog的事務已經作用在了FsImage上了
  6. NameNode啓動後會進行一個稱爲安全模式的特殊狀態
  7. 處於安全模式的NameNode是不會進行數據塊的複製的
  8. NameNode從所有的DataNode接收心跳信號和狀態報告
  9. 每當NameNode檢測確認某個數據塊的副本數目達到這個最小值,那麼該數據庫會被認爲是副本安全(safely replicated)的
  10. 在一定百分比的數據被NameNode檢測確認是安全之後,NameNode將會退出安全模式狀態
  11. 接下來它會確定還有哪些數據庫的副本沒有達到指定數目,並將數據塊複製到DataNode上
  1. HDFS中的SNN即SecondaryNameNode(SNN)—真實企業不採用此方案

  1. 在非Ha模式下,SNN一般是獨立的節點,週期完成對NN的EditLog向FsImage合併,減少EditLog大小,減少NN啓動時間
  2. 根據配置文件設置的時間間隔fs.checkpoint.period默認3600秒
  3. 根據配置文件設置edits log大小fs.checkpoint.size規定edits文件的最大值默認是64MB

 

版本1.x無Ha模式,2.x開始有Ha模式,Ha模式下2個NameNode,NameNode的個數與版本沒有任何關係。

  1. 常用服務器種類和選型

  1. 塔式服務器(Tower servers 

一般用於研發的測試環境

  1. 機架服務器(Rack server )

中小企和研發測試環境

  1. 刀片服務器(blade Server)

關於服務器選擇,PC一般選擇塔式服務器。機架服務器一般用於公司,公司中使用多臺機架服務器進行疊加,使用交換機來進行交換訊息。刀片服務器最貴,用於大型企業或者特殊服務

  1. 副本放置策略(NameNode)

  1. 第一個副本:放置在上傳文件的DN(不然還要做數據移動,浪費時間);如果是集羣外提交,則隨機挑選一臺磁盤不太滿,CPU不太忙的節點
  2. 第二個副本:放在於第一個副本不同的機架的節點
  3. 第三個副本:與第二個副本相同機架的節點
  4. 更多副本:隨機節點

爲什麼?

因爲可能只有2個副本,這樣對吧原先第1、2副本放在一臺上,這樣此臺機器掛了就徹底掛了。

  1. HDFS的讀寫流程(使用副本策略)

 HDFS的寫流程

  • Client和NN連接創建文件元數據
  • NN判定元數據是否有效
  • NN觸發副本放置策略,返回一個有序的DN列表
  • Client和DN簡歷Pipeline連接
  • Client將塊分成packet(64KB),並使用chunk(512B)+ chucksum(4B)填充
  • Client將packet發送隊列dataqueue中,並向第一個DN發送
  • 第一個DN收到packet後本地保存發送給第二個DN
  • 第二個DN收到packet後本地保存併發給第三個DN
  • 這個過程中,上游節點同時發送下一個packet
  • 類似工廠流水線,結論:流式其實也是變種的並行計算
  • HDFS使用這種傳輸方式,副本數對於Client是透明的
  • 當block傳輸完成,DN分別向各自的NN彙報(此圖沒有體現出來),同時Client繼續傳輸下一個blcok
  • 所以client傳輸和block彙報也是並行的

HDFS讀流程

 

  • 爲了降低整體的帶寬消耗和讀延遲,HDFS會盡量讓讀取程序讀取離他最近的副本(本機à本機架à其他最近的)
  • 如果再讀取程序的同一個機架上有一個副本,那麼就讀該副本
  • 如果一個HDFS集羣跨越多個數據中心,那麼客戶端也將首先讀本地數據中心的副本
  • 語義:下載一個文件
    1. ClientNN交互文件元數據獲取所有的fileBlockLocation
    2. NN按距離策略排序返回
    3. Client嘗試下載Block並且校驗數據完整性(校驗盒校驗)
  • 語義:下載一個文件其實是獲取文件的所有的Block元數據,那麼子集獲取block應該成立
    1. Hdfs支持Client輸出文件的offset自定義連接哪些BlockDN,自定義獲取數據
    2. 這個是支持計算層的分治,並行計算的核心(牢記)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章