Hadoop HDFS-分布式存储系统入门、配置、使用及架构原理分析
文章目錄
- 一、HDFS簡介
- 1.1、為什么需要HDFS
- 1.2、核心數據和行為數據
- 二、核心架構和讀寫流程
- 2.1、核心架構組件
- NameNode
- Secondary NameNode
- DataNode
- Block
- 2.2、讀數據邏輯
- 2.3、寫數據邏輯
- 三、基本命令使用
- 四、分布式可靠性保障
- 3.1、副本冗余
- 3.2、機架策略
- 3.3、心跳機制
- 3.4、安全校驗
- 3.5、數據恢復
- 附:HDFS環境配置
HDFS是Hadoop的底層分布式存儲系統,是Hadoop分布式計算的底層基石,要使用Hadoop就必須學習HDFS的使用。本文介紹了為什么要使用HDFS、HDFS的基本使用、核心架構組成以及分布式可靠性保障機制。
一、HDFS簡介
HDFS全稱為Hadoop Distributed File System,即為Hadoop提供的分布式文件系統,Hadoop底層的存儲能力都是基于HDFS來提供,所以認為HDFS是整個Hadoop體系的底層核心基石。HDFS的特點是采用了低成本的硬件設計模式,具備很高的容錯性,可以部署在價格低廉的普通服務器上,通過多臺服務器組成HDFS集群從而提供分布式存儲的能力。
1.1、為什么需要HDFS
為什么需要HDFS?一般來說普通的應用使用MySQL、Oracle甚至Redis這類數據庫就可以滿足數據的存儲需求:
但是隨著數據量越來越大,需要進行存儲和分析的數據已經達到GB甚至TB級,那么如果仍然采用MySQL這類數據庫進行存儲,會十分占用存儲資源,并且由于單表數據量過大, I/O的消耗也是巨大的,每次查詢都需要很長時間,而且在復雜的數據分析時需要Join多個表,可能會引發系統的阻塞,所以在大數據量下(GB/TB級)不太建議使用MySQL這類數據庫對數據進行存儲。
那什么存儲資源是廉價的、可拓展的呢?就是硬盤。硬盤作為計算機底層存儲資源,由于其讀寫速度遠不如內存的讀寫速度,所以十分廉價,假設一個廉價的服務器裝上了500GB容量的硬盤,那么當我們要存儲2TB容量的數據時,就可以采用4臺500GB容量的服務器來對其分割后進行存儲。如果采用這種方式存儲數據,那么整體的數據存儲成本就會比用MySQL這類數據庫存儲低得多,這就是HDFS的核心思想:數據切割+分布式存儲。
1.2、核心數據和行為數據
關于什么數據需要存儲在HDFS中,不僅是要求數據有大的數量級,一般還要求其為行為數據。這里引入兩個概念,分別是核心數據和行為數據,核心數據指的是系統正常運轉和服務所需要的數據,比如在交易過程中的訂單數據、物流數據等,缺少了核心數據系統將無法運轉,這些核心數據一般存儲在數據庫中;而行為數據指的是在產生核心數據的這個過程中,附帶產生的操作行為帶來的數據,比如操作日志數據、操作過程數據等等,缺少了行為數據也不阻礙系統正常運轉。
對于HDFS來說,主要是存儲大量的行為數據,以輔助對核心數據的分析、用戶操作的分析等等,從而利用好這些大數據對商業變現做出價值。
二、核心架構和讀寫流程
2.1、核心架構組件
HDFS的核心架構組件圖如下,主要分為Client、NameNode、SecondaryNameNode、DataNode這四個核心組件。
NameNode
- 存儲文件的描述元數據,運行時所有數據都保存到內存,整個HDFS可存儲的文件數受限于NameNode的內存大小,當NameNode內存無法容納下描述元數據時則無法繼續在HDFS中新增數據
- 一個Block在NameNode中對應一條記錄(一般一個Block記錄占用150字節),如果是大量的小文件,會消耗大量內存。因此Hadoop建議存儲少數的大文件而不是多數的小文件。
- 數據會定時保存到本地磁盤,但不保存block的位置信息,而是由DataNode注冊時上報和運行時維護(NameNode中與DataNode相關的信息并不保存到NameNode的文件系統中,而是NameNode每次重啟后,動態重建)
- NameNode失效則整個HDFS都失效了,所以要保證NameNode的可用性,NameNode是HDFS系統的入口
Secondary NameNode
因為NameNode是HDFS的入口,當NameNode出現故障時整個HDFS都不可用,所以需要提供一個備份節點,當主NameNode故障時進行轉移采用備份NameNode節點,這是一種常見的主從備份機制。而Secondar NameNode就是NameNode的備份,定時與NameNode進行同步,以保障HDFS的可用性。
DataNode
- 保存具體的block數據
- 負責數據的讀寫操作和復制操作
- DataNode啟動時會向NameNode報告當前存儲的數據塊信息,后續也會定時報告修改信息
- DataNode之間會進行通信,復制數據塊,保證數據的冗余性
Block
上文一直提到的Block塊也就是HDFS中存儲數據的基本單位,默認一個Block為64M,每個DataNode中會根據數據的大小將其切分為不同的Block,每個Block又默認含有兩份副本。使用Block的原因是:
- 大的塊可以減少磁盤尋道時間
- 減少數據塊的數量,每個Block都需在NameNode中注冊一個記錄,所以塊越大則記錄越少
2.2、讀數據邏輯
HDFS讀數據的邏輯如上圖所示,過程如下:
2.3、寫數據邏輯
HDFS寫數據的邏輯如上圖所示,過程如下:
- 4.1 客戶端將文件內容寫入第一個 DataNode(一般以 4kb 為單位進行傳輸)
- 4.2 第一個 DataNode 接收后,將數據寫入本地磁盤,同時也傳輸給第二個 DataNode
- 4.3 依此類推到最后一個 DataNode,數據在 DataNode 之間是通過 pipeline 的方式進行復制的
- 4.4 后面的 DataNode 接收完數據后,都會發送一個確認給前一個 DataNode,最終第一個 DataNode 返回確認給客戶端
- 4.5 當客戶端接收到整個 block 的確認后,會向 NameNode 發送一個最終的確認信息(ACK機制)
- 4.6 如果寫入某個 DataNode 失敗,數據會繼續寫入其他的 DataNode。然后 NameNode 會找另外一個好的 DataNode 繼續復制,以保證冗余性
- 4.7 每個 block 都會有一個校驗碼,并存放到獨立的文件中,以便讀的時候來驗證其完整性
5.文件寫完后(客戶端關閉),NameNode 提交文件,文件才可見,如果提交前,NameNode 垮掉,那文件也就丟失了
三、基本命令使用
HDFS的使用很簡單,熟悉Linux命令的使用者可以快速地上手,以下是HDFS常用的命令整理,注意其他文件和路徑名是指HDFS內部的對象,在使用前需要先初始化生產HDFS文件系統并啟動:
$ hadoop namenode -format; $ start-dfs.sh;四、分布式可靠性保障
HDFS是分布式的系統,所以務必會存在若干個服務器節點,各個節點間通過網絡進行通信,那么就會存在分布式系統的可靠性問題(CAP或BASE理論),所以HDFS主要從以下幾個方面來保障了系統的分布式可靠性。
3.1、副本冗余
HDFS的通過副本冗余機制來保障數據塊Block的冗余,默認一個Block被保存為3份,可通過hdfs-site.xml配置文件進行配置。通過副本冗余機制,使得DataNode出現故障時也不會出現單點問題,只要其他DataNode中存在備份的Block即可繼續完成數據操作,當Block恢復后會再繼續同步備份。
3.2、機架策略
HDFS在進行副本冗余時,會通過機架策略來選擇不同機架的DataNode節點來備份Block,這里的“機架”可以理解為一個局域網內的節點集合,可通過hadoop-site.xml配置文件進行配置,將不同的服務器規劃到不同的機架中。機架策略可以避免副本都存在于同一網絡之中,因為網絡故障通常會在局域網范圍內傳播,很可能導致同一網絡下的其他節點也不可使用,所以需要通過機架策略將副本放到其他局域網中,達到網絡隔離的效果。
3.3、心跳機制
NameNode會周期性從DataNode接受心跳信息和Block信息,以檢查各個DataNode是否可用,當某個DataNode不可用時則會將其標識為宕機節點,不會對其進行數據寫入和讀取等I/O操作,當其恢復后會繼續連接到NameNode中執行后續的同步操作。
3.4、安全校驗
在HDFS啟動過程中會進行Block副本數目安全校驗,如果Block的副本數目符合規定數目則啟動,否則會先進行數據備份,直到Block副本數符合規定的數目才進行啟動。
3.5、數據恢復
HDFS在刪除文件時,數據其實是放入回收站路徑/trash中,而回收站里的文件是可以快速恢復的,可以設置一個時間值,當回收站里文件的存放時間超過了這個值,就被徹底刪除,并且釋放占用的Block。
附:HDFS環境配置
HDFS環境配置也就是Hadoop的環境配置了,可以參考下面的文章進行配置,需要注意的是在啟動hadoop時,需要使用指定好的用戶登陸系統并進行啟動,否則會提示權限問題。
- Hadoop環境搭建詳解_楚興-CSDN博客
- 安裝hadoop3.0版本踩坑_風雨落-CSDN博客
總結
以上是生活随笔為你收集整理的Hadoop HDFS-分布式存储系统入门、配置、使用及架构原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UG模具设计干货!内滑块设计细节
- 下一篇: ios居然自带悬浮窗调试工具