掃盲:Hadoop分布式文件系統(HDFS)基礎概念講解!

無論你如何將Hadoop與Spark進行對比,無論Spark生態多麼成熟和完善,其底層終歸要基於HDFS,畢竟這是目前最成熟的分佈式底層文件系統,幾乎沒有哪家公司願意重新花費精力研發一個全新的文件系統。

本文將討論Hadoop分佈式文件系統(HDFS)的基本概念以及管理HDFS的十大Hadoop Shell命令。HDFS是Apache Hadoop框架的底層文件系統,是一個分佈式存儲框架,跨越數千種商用硬件。

該文件系統提供容錯、高吞吐、流數據訪問以及高可靠性等功能。HDFS的體系架構適用於存儲大量數據及快速處理,HDFS是Apache生態系統的一部分。

在此之前,我們先來了解Apache Hadoop框架,其主要包含以下幾大模塊:

  • Hadoop Common——包含Hadoop其他模塊所需的庫和實用程序;
  • HDFS——商用機存儲數據的分佈式文件系統,在集群中提供非常高的聚合帶寬;
  • Hadoop YARN ——資源管理平臺,負責管理集群上的計算資源並使用它們調度用戶應用程序;
  • Hadoop MapReduce——用於大規模數據處理的編程模型。

Hadoop中的所有模塊都設計了一個基本假設,即硬件故障(單個機器或整個機架)是顯而易見的,因此應由Hadoop框架在軟件應用程序中自動處理。

Apache Hadoop的HDFS組件最初來自Google的MapReduce和Google File System(GFS)。

HDFS是Hadoop應用程序使用的主要分佈式存儲,HDFS集群主要由NameNode和DataNode組成。NameNode管理文件系統元數據,DataNode用於存儲實際數據。

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

HDFS架構圖解釋了NameNode、DataNode和客戶端之間的基本交互,客戶端組件調用NameNode以獲取文件元數據或修改,客戶端直接使用DataNodes執行實際的文件I / O操作。

HDFS可能存在一些用戶感興趣的顯著特徵

1、非常適合使用低成本商用硬件進行分佈式存儲和處理。Hadoop具有可擴展性,容錯性且易於擴展。MapReduce以其大量分佈式應用程序的簡單性和適用性而著稱。

HDFS則具有高度可配置性,默認配置足以滿足大多數應用程序的需求。通常,僅需要針對非常大的集群調整默認配置;

2、Hadoop是基於Java平臺編寫的,幾乎在所有主要平臺上都受支持;

3、Hadoop支持shell和shell類命令與HDFS的通信;

4、NameNode和DataNode具有內置Web服務器,可以輕鬆檢查集群的當前狀態;

5、HDFS中經常實現新的功能和更新,以下列表是HDFS中可用的功能子集:

  • 文件權限和身份驗證;
  • Rackawareness:有助於在計劃任務和分配存儲時考慮節點的物理位置;
  • Safemode:管理主要用於維護的模式;
  • fsck:這是一個實用程序,用於診斷文件系統的運行狀況以及查找丟失的文件或塊;
  • fetchdt:這是一個用於獲取DelegationToken並將其存儲在本地系統文件中的實用程序;
  • Rebalancer:當數據在DataNode之間分佈不均時,這是一個用於平衡集群的工具;
  • 升級和回滾:軟件升級後,可以在升級前回滾到上一狀態,以防出現任何意外;
  • SecondaryNameNode:此節點執行命名空間的Checkpoint,並幫助將包含HDFS修改日誌的文件大小保持在NameNode的特定限制內;
  • Checkpoint節點:此節點執行命名空間的Checkpoint,並有助於最小化存儲在NameNode中的日誌大小,其中包含對HDFS所做的更改,它還替換了以前由Secondary NameNode填充的角色或功能。作為替代方案,NameNode允許多個節點作為Checkpoint,只要系統沒有可用(註冊)的備份節點即可;
  • Backup節點:可以將其定義為Checkpoint節點的擴展。除了Checkpoint之外,它還用於從NameNode接收編輯流。因此,它維護自己命名空間的內存副本,始終與活動的NameNode和命名空間狀態同步,一次只允許向NameNode註冊一個備份節點。

HDFS的設計目標

Hadoop的目標是在非常大的集群中使用常用服務器,並且每個服務器都有一組廉價內部磁盤驅動器。為了獲得更好的性能,MapReduce API嘗試在存儲要處理的數據的服務器上分配工作負載,這稱為數據局部性。

因此,在Hadoop環境中,建議不要使用區域存儲網絡(SAN)或網絡直接存儲(NAS) 。對於使用SAN或NAS的Hadoop部署,額外的網絡通信開銷可能會導致性能瓶頸,尤其是在集群規模較大的情況下。

假設,我們目前擁有1000臺機器集群,每臺機器都有三個內部磁盤驅動器。因此,請考慮由3000個廉價驅動器+ 1000個廉價服務器組成的集群的故障率,這個數值會非常大!

不過,好在廉價硬件相關的MTTF故障率實際上已被很好地理解和接受,這讓用戶對Hadoop的包容性變得很高。Hadoop具有內置的容錯和故障補償功能,HDFS也是如此,因為數據被分成塊,這些塊的副本存儲在Hadoop集群的其他服務器上。

為了使其易於理解,我們可以說單個文件實際上存儲為較小的塊,這些塊在整個集群中的多個服務器之間進行復制,以便更快地訪問文件。

我們可以考慮一個應用場景,假設我們現在需要存儲某區域內所有居民的電話號碼,將姓氏以A開頭的存儲在服務器1上,以B開頭的在服務器2上,依此類推。

在Hadoop環境中,此電話簿的各個部分將分佈式存儲在整個集群中。如果要重建整個電話簿的數據,程序需要訪問集群中每個服務器的塊。為了實現更高的可用性,HDFS默認將較小的數據複製到另外兩臺服務器上。

這裡會涉及到冗餘的概念,但支持冗餘是為了避免故障並提供容錯解決方案,可以基於每個文件或針對整個環境增加或減少該冗餘。這種冗餘具備多種好處,最明顯的一個是數據高可用。除此之外,數據冗餘允許Hadoop集群將工作分解為更小的塊,並在集群中的所有服務器上運行較小的作業,以實現更好的可伸縮性。

最後,作為最終用戶,我們獲得了數據局部性的好處,這在處理大型數據集時至關重要。

管理HDFS的十大Hadoop Shell命令

以下是通過shell命令管理Hadoop HDFS的十大基本操作,這些操作對於管理HDFS集群上的文件非常有用。出於測試目的,你可以使用Cloudera或者Hortonworks等中的某些VM調用此命令,或者用於偽分佈式集群設置。

1、在給定路徑的HDFS中創建目錄

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

2、列出目錄內容

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

3、在HDFS中上傳和下載文件

Upload:

hadoop fs -put:

將單個src文件或多個src文件從本地文件系統複製到Hadoop數據文件系統

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

將文件複製/下載到本地文件系統

Download:

hadoop fs -get:

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

4、查看文件的內容

與unix cat命令相同:

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

5、將文件從源複製到目標

此命令也允許多個源,在這種情況下,目標必須是目錄。

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

6、將文件從(到)本地文件系統複製到HDFS

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

與put命令類似,但源僅限於本地文件引用。

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

7、將文件從源移動到目標

注意:不允許跨文件系統移動文件。

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

8、刪除HDFS中的文件或目錄

刪除指定為參數的文件,僅在目錄為空時刪除目錄:

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

9、顯示文件的最後幾行

類似於Unix中的tail命令

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

10、顯示文件的聚合長度

掃盲:Hadoop分佈式文件系統(HDFS)基礎概念講解!

結論

我們已經看到HDFS是Apache Hadoop生態系統的重要組件之一。相比於本地文件系統,HDFS確實非常強大。

因此,所有大數據應用程序都使用HDFS進行數據存儲,這也是作為大數據人必須瞭解HDFS的原因。


分享到:


相關文章: