HDFS 架構解析

HDFS 架構解析

本文以 Hadoop 提供的分佈式文件系統(HDFS)爲例來進一步展開解析分佈式存儲服務架構設計的要點。

架構目標

任何一種軟件框架或服務都是爲了解決特定問題而產生的。還記得我們在 《分佈式存儲 - 概述》一文中描述的幾個關注方面麼?分佈式文件系統屬於分佈式存儲中的一種面向文件的數據模型,它需要解決單機文件系統面臨的容量擴展和容錯問題。

所以 HDFS 的架構設計目標就呼之欲出了:

  1. 面向超大文件或大量的文件數據集
  2. 自動檢測局部的硬件錯誤並快速恢復

基於此目標,考慮應用場景出於簡化設計和實現的目的,HDFS 假設了一種 write-once-read-many 的文件訪問模型。這種一次寫入並被大量讀出的模型在現實中確實適應很多業務場景,架構設計的此類假設是合理的。正因爲此類假設的存在,也限定了它的應用場景。

架構總攬

下面是一張來自官方文檔的架構圖: 
這裏寫圖片描述

從圖中可見 HDFS 的架構包括三個部分,每個部分有各自清晰的職責劃分。

  1. NameNode
  2. DataNode
  3. Client

從圖中可見,HDFS 採用的是中心總控式架構,NameNode 就是集羣的中心節點。

NameNode

NameNode 的主要職責是管理整個文件系統的元信息(Metadata),元信息主要包括:

  • File system namesapce 
    HDFS 類似單機文件系統以目錄樹的形式組織文件,稱爲 file system namespace
  • Replication factor 
    文件副本數,針對每個文件設置
  • Mapping of blocks to DataNodes 
    文件塊到數據節點的映射關係

在上面架構圖中,指向 NameNode 的 Metadata ops 主要就是針對文件的創建、刪除、讀取和設置文件的副本數等操作,所以所有的文件操作都繞不過 NameNode。除此之外 NameNode 還負責管理 DataNode,如新的 DataNode 加入集羣,舊的 DataNode 退出集羣,在 DataNode 之間負載均衡文件數據塊的分佈等等。更多關於 NameNode 的設計實現分析,後面會單獨成文詳解。

DataNode

DataNode 的職責如下:

  • 存儲文件塊(block)
  • 服務響應 Client 的文件讀寫請求
  • 執行文件塊的創建、刪除和複製

從架構圖上看到有個 Block ops 的操作箭頭從 NameNode 指向 DataNode,會讓人誤以爲 NameNode 會主動向 DataNode 發出指令調用。實際上 NameNode 從不調用 DataNode,僅僅是通過 DataNode 定期向 NameNode 發送心跳來攜帶回傳的指令信息。

架構圖上專門標記了 Rack1 和 Rack2,表明了 HDFS 在考慮文件數據塊的多副本分佈時針對機架感知作了專門設計,細節我們這裏先不展開,更多關於 DataNode 的設計實現分析,後面會單獨成文詳解。

Client

考慮到 HDFS 交互過程的複雜性,所以特地提供了針特定編程語言的 Client 以簡化使用。Client 的職責如下:

  • 提供面向應用編程語言的一致 API,簡化應用編程
  • 改善訪問性能

Client 之所以能夠改善性能是因爲針對讀可以提供緩存(cache),針對寫可以通過緩衝(buffer)批量方式,細節我們這裏也先不展開,更多關於 Client 的設計實現分析,後面會單獨成文詳解。

總結

本來想在一篇文章裏寫完 HDFS 架構解析的,寫着寫着發現不太可能。作爲分佈式系統中最複雜的分佈式存儲類系統,每一個架構設計權衡的實現細節點,都值得好好推敲,一旦展開此文感覺就會長的沒完沒了,所以這裏先總體過一下,針對每個部分的設計實現細節再以主題文章來詳細解析。

參考

[1]Hadoop Documentation. HDFS Architecture
[2]Robert Chansler, Hairong Kuang, Sanjay Radia, Konstantin Shvachko, and Suresh Srinivas. The Hadoop Distributed File System


轉載自:http://www.cnblogs.com/mindwind/p/4833102.html

發佈了3 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章