HDFS是Google公司的 GFS論文 思想的實作,它由NameNode(名稱節點)、DataNode(資料節點)、SecondaryNameNode(第二名稱節點)組成,其中, NameNode 相當于論文中的 GFS Master , DataNode 相當于論文中的 GFS Chunk Server ,
GFS 是一個可擴展的分布式檔案系統設計思想,用于設計針對大型的、分布式的、對大量資料進行訪問的檔案系統,
- 一、 HDFS簡介
- 1.1 HDFS的概述
- 1.2 HDFS的優點
- 1.3 HDFS的缺點
- 二、 HDFS的組成與架構
- 2.1 NameNode節點
- 2.1.1 節點職責
- 2.2 DataNode節點
- 2.2.1 節點職責
- 2.3 SecondaryNameNode節點
- 2.3.1 節點職責
一、 HDFS簡介
1.1 HDFS的概述
HDFS是基于 流資料 訪問模式的 分布式檔案系統 ,其設計建立在 “一次寫入、多次讀取” 的基礎上,提供高吞吐量、高容錯性的資料訪問,能很好地解決海量資料的存盤問題,
流資料 是指數千個資料源 持續生成 的資料,可以理解為隨時間延續而 無限增長 的動態資料集合,
通俗點說,如果把資料比如成一個水庫,那么流進去的水,就是流資料(就像我們聽的音樂,屬于音樂流;而看到的文字、圖片這些較為固定的,一次性下載的,形成不了流),
在Hadoop生態圈中,HDFS屬于底層基礎,負責存盤檔案,
(圖片來源于網路)

1.2 HDFS的優點
HDFS的優點:
- 高容錯性,提供了容錯和恢復機制,副本丟失后,自動恢復,
- 高可靠性,資料自動保存多個副本,通過多副本提高可靠性,
- 適合大資料處理,可以處理超大檔案,比如 TB級甚至PB級 的檔案,
- 適合批處理,移動計算而非移動資料;資料位置暴露給計算框架,
- 支持流式資料訪問,一次性寫入,多次讀取(一個資料集一旦生成,就會被復制分發到不同的存盤節點,各節點可以進行讀取/訪問);保證資料一致性,
- 低成本運行,可以運行在低成本的硬體之上,
- …
HDFS 默認保存 3 份副本,
第一個副本:放置在 上傳檔案 的資料節點(第一個副本如果是在 集群外 提交,則隨機挑選一個 CPU 比較空閑 、 磁盤不太滿 的節點);
第二個副本:放置在與 第一個副本 不同 的機架的節點上;
第三個副本:放在與 第二個副本 相同 的機架的其他節點上,
1.3 HDFS的缺點
HDFS的缺點:
- 不適合處理 低延遲 的資料訪問,比如用戶 要求時間比較短 的低延遲應用(主要處理高資料吞吐量的應用),
- 不適合處理 大量的小 檔案,會造成尋址時間超過讀取時間;會占用NameNode大量記憶體,因為NameNode把檔案系統的元資料存放在記憶體中(檔案系統的容量由NameNode的大小決定),小檔案太多會消耗NameNode的記憶體,
- 不適合 并發寫入,一個檔案只能有一個寫入者,HDFS暫不支持多個用戶對同一個檔案的寫操作,
- 不適合 任意修改 檔案,僅支持append(附加),不支持在檔案的任意位置進行修改,
- …
二、 HDFS的組成與架構
HDFS的組成架構圖及各部分功能如下所示:

(圖片來源于網路)
2.1 NameNode節點
當用戶訪問資料檔案時,為了保證能夠讀取到每一個資料塊, HDFS有一個專門 負責保存檔案屬性資訊的節點,這個節點就是 NameNode 節點(即 名稱節點 ),
2.1.1 節點職責
NameNode節點 是HDFS的管理者,負責保存和管理HDFS的元資料,
其職責有以下三個方面:
① 管理維護HDFS的命名空間
NameNode管理HDFS系統的命名空間,維護檔案系統樹以及檔案系統樹中所有檔案的元資料,管理這些資訊的的檔案分別是 edits(操作日志檔案) 和 fsimage(命名空間鏡像檔案) ,
editlog(操作日志):在NameNode啟動的情況下,對HDFS進行的各種操作進行記錄,(HDFS客戶端執行的所有操作都會被記錄到editlog檔案中,這些檔案由edits檔案保存)
fsimage:包含HDFS中的元資訊(比如修改時間、訪問時間、資料塊資訊等),
② 管理DataNode上的資料塊
負責管理資料塊上所有的元資料資訊(管理DataNode上資料塊的均衡,維持副本數量),
③ 接收客戶端的請求
接收客戶端檔案上傳、下載、創建目錄等的請求,
2.2 DataNode節點
HDFS首先把大檔案切分成若干個小的資料塊,再把這些資料塊寫入不同的節點,這個 負責保存檔案資料的節點就是 DataNode 節點(即 資料節點 ),
2.2.1 節點職責
DataNode節點 負責存盤資料,把Block(資料塊)以Linux檔案的形式保存在磁盤上,并根據Block標識和位元組范圍來讀寫塊資料,
其職責有以下三個方面:
① 保存資料塊
一個資料塊會在多個DataNode進行冗余備份(在某一個DataNode最多只有一個備份),
② 負責客戶端對資料塊的IO請求
在客戶端執行寫操作時,DataNode之間會相互通信,保證寫操作的一致性,
③ 定期和NameNode進行心跳通信,接受NameNode的指令
如果NameNode節點10分鐘沒有收到DataNode的心跳資訊,就會將其上的資料塊復制到其他DataNode節點,
因此,NameNode節點上并不會永久保存DataNode節點上的資料塊資訊,而是通過與DataNode節點心跳聯系的方式,來更新節點上的映射表,以此減輕負擔,
問題:HDFS資料塊默認大小為128M(Hadoop2.2之前為64M),將HDFS的資料塊設定得很大的目的是什么?(傳統資料塊只有512個位元組)
答:為了減少尋址開銷,讓HDFS的檔案傳輸時間由傳輸速率決定(如果塊設定得足夠大,從磁盤 傳輸資料的時間 會明顯大于 定位這個塊開始位置 所需的時間),
2.3 SecondaryNameNode節點
HDFS有一個定期創建命名空間的檢查點(CheckPoint)操作的節點,也就是SecondaryNameNode節點(即 第二名稱節點),
出于可靠性考慮,SecondaryNameNode節點與NameNode節點通常運行在不同的機器上,且SecondaryNameNode節點與NameNode節點的記憶體要一樣大,
(如果想了解 SecondaryNameNode 的作業流程,可以參考這篇文章:淺析 SecondaryNameNode 的作業流程 )
問題:一般情況下,一個集群中的SecondaryNameNode節點也是只有一個的原因是什么?
答:因為如果多的話,會增加NameNode的壓力,使其忙于元資料的傳輸/接收、日志的傳輸/切換,從而導致性能下降;同時,NameNode節點也不支持做并發檢查點,
2.3.1 節點職責
SecondaryNameNode節點 定期把NameNode的 fsimage 和 edits 下載到本地,再將它們加載到記憶體并進行合并,最后把合并后新的 fsimage 回傳NameNode (這個程序稱為檢查點),
經典問題:NameNode與SecondaryNameNode有沒有關系?

SecondaryNameNode節點的作業流程可以參考這篇文章:
其職責有以下兩個方面:
① 防止edits過大
定期合并 fsimage 和 edits 檔案,使 edits 大小保持在限制范圍內,這樣做減少了重新啟動NameNode時合并 fsimage 和 edits 耗費的時間,從而減少了NameNode啟動的時間,

② 做冷備份
對一定范圍內資料做快照性備份,在NameNode失效時能恢復部分 fsimage ,
好了,HDFS 及其組成框架介紹完成,
如果想進一步了解 HDFS 的作業機制,可以參考這篇文章:圖文詳解 HDFS 作業機制及其原理 ,
如果文章對您有幫助,請點個贊,留給評論支持一下😊,若有疑問可以私信留言😉,如果能給個三連(點贊、收藏、關注 )就最好啦😁,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276162.html
標籤:其他
