閱讀456 返回首頁    go 阿裏雲 go 技術社區[雲棲]


HDFS追本溯源:體係架構詳解

      Hadoop是一個開發和運行處理大規模數據的軟件平台,是Apache的一個用Java語言實現開源軟件框架,實現在大量計算機組成的集群中對海量數據進行分布式計算。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力高速運算和存儲。

     Hadoop框架中最核心設計就是:HDFS和MapReduce。HDFS提供了海量數據的存儲,MapReduce提供了對數據的計算。HDFS在Hadoop中扮演了非常基礎的作用,以文件係統的形式為上層應用提供海量數據的存儲服務。

     HDFS作為一個分布式文件係統,具有高容錯的特點。它可以部署在廉價的通用硬件上,提供高吞吐率(Throughput)的數據訪問,特別適合那些需要處理海量數據集的應用程序。它沒有遵循POSIX的要求,不支持ls,cp這樣標準的UNIX命令,也不支持fopen和fread這樣的文件讀寫方法。它采用全新的設計,提供了一套特有的,基於Hadoop抽象文件係統的API,支持以流的方式訪問文件係統的數據。


1. HDFS的特征與局限

      HDFS有以下特性:

  1. 支持超大文件。理論上,HDFS上的單個文件可以存儲到整個集群的所有存儲空間。
  2. 硬件故障的快速恢複。由於集群包含成百上千個節點,硬件故障就是一個非常常見的問題了。故障檢測和自動恢複在HDFS設計之初就是很重要的設計目標。
  3. 流式數據訪問。HDFS處理的數據規模都比較大,應用一次需要訪問大量的數據。同時,這些應用一般是批量處理,而不是用戶交互式處理。HDFS使得應用程序能夠以stream的方式訪問數據集,注重的是數據的吞吐量,而不是數據訪問的速度。
  4. 簡化的一致性模型。HDFS的文件一旦創建,隻能追加,不能對已有數據進行修改。這樣簡單的一致性模型有利於提供高吞吐量的數據訪問。

正是由於上麵的一些設計特征,因此HDFS並不適合以下應用:

  1. 低延時數據訪問。在用戶交互性的應用中,應用需要在ms或者幾個s的時間內得到響應。由於HDFS為高吞吐率做了設計,也因此犧牲了快速響應。對於低延時的應用,可以考慮使用HBase或者Cassandra。
  2. 大量的小文件。標準的HDFS數據塊的大小是64M,存儲小文件並不會浪費實際的存儲空間,但是無疑會增加了在NameNode上的元數據,大量的小文件會影響整個集群的性能。前麵我們知道,Btrfs為小文件做了優化-inline file,對於小文件有很好的空間優化和訪問時間優化。
  3. 多用戶寫入,修改文件。HDFS的文件隻能有一個寫入者,而且寫操作隻能在文件結尾以追加的方式進行。它不支持多個寫入者,也不支持在文件寫入後,對文件的任意位置的修改。

但是在大數據領域,分析的是已經存在的數據,這些數據一旦產生就不會修改,因此,HDFS的這些特性和設計局限也就很容易理解了。HDFS為大數據領域的數據分析,提供了非常重要而且十分基礎的文件存儲功能。


2. 體係結構

2.1 概述

      HDFS采用了主從式(Master/Slave)的體係結構,其中NameNode(NN),DataNode(DN)和Client是HDFS中的3個重要角色。HDFS也在社區的努力下不斷演進,包括支持文件追加,Federation,HA的引入等。關於演進曆史可以點擊此處。關於HA和Federation的內容,請參考博文《HDFS HA: 高可靠性分布式存儲係統解決方案的曆史演進》。本文僅僅涉及Secondary NameNode(SNN)。

    在一個HDFS中,有一個NN,一個SNN和眾多的DN,在大型的集群中可能會有數以千計的DN。而Client,一般意義上比數據節點的個數還要多。它們之間的關係如下圖:

NN管理了HDFS兩個最重要的關係:

  1. 目錄文件樹結構和文件與數據塊的對應關係:會持久化到物理存儲中,文件名叫做fsimage。
  2. DN與數據塊的對應關係,即數據塊存儲在哪些DN中:在DN啟動時會上報到NN它所維護的數據塊。這個是動態建立的,不會持久化。因此,集群的啟動可能需要比較長的時間。

而DN則保存了數據塊。並且執行NN的命令,比如複製,拷貝,刪除等操作。

Client則是使用HDFS的主題,包括寫文件,讀文件等常見操作。


2.2 數據塊

      上文多次提到數據塊,那麼什麼是數據塊?為了便於管理,設備往往將存儲空間組織成具有一定結構的存儲單位。比如硬盤,文件以塊的形式存儲在硬盤中,塊的大小代表了係統讀和寫操作的最小單位;在Linux的Ext3文件係統中,塊的大小默認為4K。文件係統通過一個塊大小的整數倍來使用硬盤。硬盤上的數據塊管理屬於文件係統實現的內部細節;對於調用係統接口來讀寫文件的用戶來說是透明的。

      HDFS的塊也是類似的原理。隻不過它的塊擁有更大的數據單元,默認的數據塊大小是64M。HDFS將文件進行分塊,塊作為單獨的存儲單元,在Linux上以普通文件的形式保存在DN的文件係統中。數據塊是HDFS文件存儲的基本單位。在這裏要注意,HDFS並不直接管理硬盤,它是通過DN上的文件係統存儲數據塊,通過管理數據塊,來完成文件管理服務的。

     HDFS是針對大文件設計的分布式係統,使用數據塊有許多的好處:

  1. 文件大小不受單個DN的存儲空間限製,文件可以保存到任意的DN上。
  2. 簡化了存儲子係統。簡單化是所有係統的設計追求。特別是在故障種類繁多的分布式係統。將管理塊和管理文件分開,簡化了存儲管理,也消除了分布式管理文件元數據的複雜性。
  3. 方便容錯,有利於數據複製。在HDFS中,為了應對損壞的塊以及硬盤,機器故障,數據塊會在不同的節點上進行複製。如果一個數據塊的副本丟失或者損壞,係統會在其他地方讀取副本,並且數據塊會複製到一個正常運行的節點上,保證數據塊副本數的最低要求。當然了,這個過程對於Client來說是透明的,它實現了分布式係統中的位置透明性和故障透明性。

      那麼為什麼數據塊那麼大呢?其實和文件係統的大數據塊的原理是一樣的。在普通的文件係統中使用較大的數據塊,可以減少管理數據塊所需要的開銷,如在Linux中可以減少保存在i-node中硬盤地址表中的信息鏈的長度;同時在對文件進行讀寫時,可以減少尋址開銷,即硬盤定位數據塊的次數。在HDFS中采用大數據庫唉,可以減少NN上管理文件和數據塊關係的開銷,而且在文件讀寫時,減少因為建立網絡連接的開銷。


2.3 NN

      NN是HDFS主從結構中主節點上運行的主要進程,它負責管理從節點DN。NN維護著整個文件係統的文件目錄樹,文件目錄的元信息和文件的數據塊索引。這些信息以兩種信息保存在本文文件係統中,一種是文件係統鏡像(文件名字fsimage),另一種是fsimage的編輯日誌(文件名字edits)。

      fsimage中保存著某一特定時刻HDFS的目錄樹、元信息和文件數據塊的索引等信息,後續的對這些信息的改動,則保存在編輯日誌中,它們一起提供了一個完整的NN的第一關係。

      同時,通過NN,Client還可以了解到數據塊所在的DN的信息。需要注意的是,NN中關於DN的信息是不會保存到NN的本地文件係統的,也就是上麵提到的fsimage和edits中。NN每次啟動時,都會通過每個DN的上報來動態的建立這些信息。這些信息也就構成了NN第二關係。

 另外,NN還能通過DN獲取HDFS整體運行狀態的一些信息,比如係統的可用空間,已經使用的空間,各個DN的當前狀態等。

2.4 SNN

    Secondary NameNode是用於定期合並fsimage和edits的。與NN一樣,每個集群都有一個SNN,在大規模部署的條件下,一般SNN也獨自占用一台服務器。SNN按照集群配置的時間建個,不停的獲取HDFS某一個時間點的fsimage和edits,合並它們得到一個新的fsimage。該fsimage上傳到NN後會替換NN的老的fsimage。

     從上麵可以看出,SNN會配合NN,為NN的第一關係提供了一個簡單的CheckPoint機製,並避免出現edits過大,導致NN啟動時間過長的問題。

     注意,SNN並不是NN的strandby。NN是HDFS集群中的SPOF(Single Point of Failure)。通過SNN,可以減少NN的啟動時間並且降低NN元數據丟失的風險。但是,在HA出現前,NN的失效是要通過人工幹預的。

最後更新:2017-04-03 12:56:09

  上一篇:go 經典的NIM-poj-2975-Nim
  下一篇:go X. ClibPDF Functions 介紹