大資料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 保留訪問和修改時間,所有權和許可權。

更多命令可以檢視官方文件

https://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萬現金大獎」