大數據HDFS憑啥能存下百億數據?

語言: CN / TW / HK

theme: cyanosis

歡迎關注大數據系列課程

前言

大家平時經常用的百度網盤存放電影、照片、文檔等,那有想過百度網盤是如何存下那麼多文件的呢?難到是用一台計算機器存的嗎?那得多大磁盤啊?顯然不是的,那本文就帶大家揭祕。

分佈式存儲思想

既然一台機器的存儲所需的磁盤有上限瓶頸,那麼我們能否利用多台機器形成一個整體用來存儲呢?這就是我們所説的分佈式存儲。

  • 單機縱向擴展:磁盤不夠加磁盤,有上限瓶頸限制
  • 多機橫向擴展:機器不夠加機器,理論上無限擴展

Hadoop就是採用了這樣的一個思想,設計出了分佈式存儲系統HDFS。

HDFS介紹和使用

HDFS(Hadoop Distributed File System ),意為:Hadoop分佈式文件系統。它是Apache Hadoop核心組件之一,作為大數據生態圈最底層的分佈式存儲服務而存在。也可以説大數據首先要解決的問題就是海量數據的存儲問題。

  • HDFS主要是解決大數據如何存儲問題的。分佈式意味着是HDFS是橫跨在多台計算機上的存儲系統。
  • HDFS是一種能夠在普通硬件上運行的分佈式文件系統,它是高度容錯的,適應於具有大數據集的應用程序,它非常適於存儲大型數據 (比如 TB 和 PB)。
  • HDFS使用多台計算機存儲文件, 並且提供統一的訪問接口, 像是訪問一個普通文件系統一樣使用分佈式文件系統。

HDFS使用

HDFS安裝好了,具體是如何使用呢,如何上傳和下載文件呢?一共有兩種方式,通過shell命令和web頁面。

  1. shell命令操作HDFS

類似linux命令,可以直接通過在命令行界面操作。Hadoop提供了文件系統的shell命令行客户端: hadoop fs [generic options]

  • 創建文件夾

hadoop fs -mkdir [-p] <path> ...

path 為待創建的目錄

-p選項的行為與Unix mkdir -p非常相似,它會沿着路徑創建父目錄。

  • 查看指定目錄下內容

hadoop fs -ls [-h] [-R] [<path> ...]

path 指定目錄路徑

-h 人性化顯示文件size

-R 遞歸查看指定目錄及其子目錄

  • 上傳文件到HDFS指定目錄下

hadoop fs -put [-f] [-p] <localsrc> ... <dst>

-f 覆蓋目標文件(已存在下)

-p 保留訪問和修改時間,所有權和權限。

localsrc 本地文件系統(客户端所在機器)

dst 目標文件系統(HDFS)

hadoop fs -put zookeeper.out /alvin hadoop fs -put file:///etc/profile hdfs://node1:8020/alvin

  • 查看HDFS文件內容

hadoop fs -cat <src> ...

讀取指定文件全部內容,顯示在標準輸出控制枱。

注意:對於大文件內容讀取,慎重。

  • 下載HDFS文件

hadoop fs -get [-f] [-p] <src> ... <localdst>

下載文件到本地文件系統指定目錄,localdst必須是目錄

-f 覆蓋目標文件(已存在下)

-p 保留訪問和修改時間,所有權和權限。

更多命令可以查看官方文檔

http://hadoop.apache.org/docs/r3.3.0/hadoop-project-dist/hadoop-common/FileSystemShell.html

2.web界面操作HDFS

另外一種更簡單直觀的方式是通過web界面操作HDFS,默認是50070端口,如下圖所示:

HDFS的架構

HFDS採用分佈式的架構,可能有成百上千的服務器組成,每一個組件都有可能出現故障。因此故障檢測和自動快速恢復是HDFS的核心架構目標,下面是HDFS的官方架構圖:

主從架構

HDFS集羣是標準的master/slave主從架構集羣,一般一個HDFS集羣是有一個Namenode和一定數目的DataNode組成。

主角色:NameNode

  • NameNode是Hadoop分佈式文件系統的核心,架構中的主角色。 
  • NameNode維護和管理文件系統元數據,包括名稱空間目錄樹結構、文件和塊的位置信息、訪問權限等信息。 
  • 基於此,NameNode成為了訪問HDFS的唯一入口。

從角色:DataNode

  • DataNode是Hadoop HDFS中的從角色,負責具體的數據塊存儲。 
  • DataNode的數量決定了HDFS集羣的整體數據存儲能力,通過和NameNode配合維護着數據塊。

主角色輔助角色: SecondaryNameNode

此外,HDFS中還有一個SecondaryNameNode,雖然途中沒有畫出,那它有什麼用呢?

  • Secondary NameNode充當NameNode的輔助節點,但不能替代NameNode。 
  • 主要是幫助主角色進行元數據文件的合併動作。可以通俗的理解為主角色的“祕書”。

分塊存儲

由於有的文件很大,一台機器也存不下,於是HDFS會對我們的文件做一個物理上的切割,也就是分塊存儲。

HDFS中的文件在物理上是分塊存儲(block)的,默認大小是128M(134217728),不足128M則本身就是一塊。

副本機制

既然分佈式存儲海量數據,那麼肯定需要成千上百的機器,這樣很有可能其中一台機器宕機,出故障了怎麼辦呢?

當然HDFS也想到了解決方案,文件的所有block都會有副本。副本系數可以在文件創建的時候指定,也可以在之後通過命令改變。副本數由參數dfs.replication控制,默認值是3,也就是會額外再複製2份,連同本身總共3份副本,而且這個副本儘量會分散在不同的機架上,規避風險。

NameNode高可用

既然DataNode有副本,出現數據丟失可能性很小,那NameNode掛了不是照樣涼涼?

不用擔心,那我在啟動一個NameNode備在那裏不就行了嗎。

存在兩個 NameNode,一個是活動的 NameNode,稱為 Active,另外一個是備用的 NameNode,稱為 Standby。Active節點的數據通過JournalNode節點同步給Standby節點。 當 Active 節點出現問題時,需要將 Standby 節點切換為 Active 節點來為客户端提供服務,這樣就保證了高可用。

元數據管理

前面提到NameNode中包含元數據,那麼究竟具體是哪些內容呢?

在HDFS中,Namenode管理的元數據具有兩種類型:

  • 文件自身屬性信息

文件名稱、權限,修改時間,文件大小,複製因子,數據塊大小。

  • 文件塊位置映射信息

記錄文件塊和DataNode之間的映射信息,即哪個塊位於哪個節點上。

總結

現在你終於知道為什麼百度網盤可以存下海量的數據了吧,主要採用的是分佈式的存儲,將數據分塊多副本的方式存儲到多個數據節點DataNode, 然後由唯一的NameNode節點去管理這個文件的信息,比如説它是在那些DataNode節點上,大小是多少等等,注意這裏是DataNode主動告訴NameNode它這裏有哪些文件塊。

如果本文對你有幫助的話,請留下一個贊吧
歡迎關注個人公眾號——JAVA旭陽

本文正在參加「金石計劃 . 瓜分6萬現金大獎」