通過 Windows 命令提示符(cmd)在桌面新建文件夾,并在該文件夾中編譯、運行一段 Java 程序段
911
2025-03-31
Apache Hadoop HDFS架構
介紹:
在這篇博客中,我將討論 Apache Hadoop HDFS 架構。?HDFS 和 YARN 是Hadoop 認證需要掌握的兩個重要概念。你知道HDFS是部署在低成本商品硬件的分布式文件系統。因此,現在是我們深入研究 Apache Hadoop HDFS 架構并釋放其美感的時候了。
這篇關于 Apache Hadoop HDFS 架構的博客將涵蓋的主題如下:
HDFS Master/Slave Topology
NameNode,?DataNode?and?Secondary NameNode
What is a block?
Replication Management
Rack Awareness
HDFS Read/Write – Behind the scenes
HDFS架構:
Apache HDFS?或?Hadoop 分布式文件系統?是一種塊結構的文件系統,其中每個文件都被分成預定大小的塊。這些塊存儲在由一臺或多臺機器組成的集群中。Apache Hadoop HDFS 架構遵循?主/從架構,其中集群由單個 NameNode(主節點)組成,所有其他節點都是 DataNode(從節點)。HDFS 可以部署在各種支持 Java 的機器上。雖然可以在一臺機器上運行多個 DataNode,但在實際世界中,這些 DataNode 分布在不同的機器上。
名稱節點:
NameNode 是 Apache Hadoop HDFS 架構中的主節點,用于維護和管理 DataNode(從節點)上存在的塊。NameNode 是一個高度可用的服務器,它管理文件系統命名空間并控制客戶端對文件的訪問。我將在下一篇博客中討論 Apache Hadoop HDFS 的這個高可用性特性。HDFS 架構的構建方式使得用戶數據永遠不會駐留在 NameNode 上。數據僅駐留在 DataNode 上。
NameNode的功能:
它是維護和管理 DataNode(從節點)的主守護進程
它記錄了集群中存儲的所有文件的元數據,例如存儲塊的位置、文件的大小、權限、層次結構等。有兩個文件與元數據相關聯:
FsImage:?它包含自 NameNode 啟動以來文件系統命名空間的完整狀態。
EditLogs:?它包含相對于最新的 FsImage 對文件系統所做的所有最新修改。
它記錄對文件系統元數據發生的每個更改。例如,如果在 HDFS 中刪除了一個文件,NameNode 會立即將其記錄在 EditLog 中。
它會定期從集群中的所有 DataNode 接收 Heartbeat 和塊報告,以確保 DataNode 處于活動狀態。
它記錄了 HDFS 中的所有塊以及這些塊位于哪些節點。
名稱節點還負責采取照顧?復制因子?的所有這些,我們將詳細討論稍后在本教程HDFS博客塊。
在?DataNode 失敗的情況下,NameNode 為新副本選擇新的 DataNode,?平衡?磁盤使用并管理到 DataNode 的通信流量。
數據節點:
DataNode 是 HDFS 中的從節點。與 NameNode 不同,DataNode 是一種商品硬件,即一個不昂貴的系統,不具有高質量或高可用 性。DataNode 是一個塊服務器,將數據存儲在本地文件 ext3 或 ext4 中。
DataNode的功能:
這些是在每個從屬機器上運行的從屬守護進程或進程。
實際數據存儲在 DataNode 上。
DataNode 執行來自文件系統客戶端的低級讀取和寫入請求。
它們定期向 NameNode 發送心跳以報告 HDFS 的整體健康狀況,默認情況下,此頻率設置為 3 秒。
到現在為止,您一定已經意識到 NameNode 對我們來說非常重要。如果失敗,我們就完蛋了。不過別擔心,我們將在下一篇 Apache Hadoop HDFS 架構博客中討論 Hadoop 如何解決這個單點故障問題。所以,暫時放松一下,讓我們一步一步來。
輔助名稱節點:
除了這兩個守護進程之外,還有第三個守護進程或進程稱為 Secondary NameNode。輔助 NameNode 作為輔助守護進程與主 NameNode 同時工作。并且不要對輔助 NameNode 是備份 NameNode感到困惑,因為它不是。
二級NameNode的功能:
Secondary NameNode 是一種不斷從NameNode 的RAM 中讀取所有文件系統和元數據并將其寫入硬盤或文件系統的節點。
它負責將 EditLogs?與來自 NameNode的 FsImage 結合起來。
它定期從 NameNode 下載 EditLogs 并應用于 FsImage。新的 FsImage 被復制回 NameNode,在下次啟動 NameNode 時使用。
因此,Secondary NameNode 在 HDFS 中執行常規檢查點。因此,它也被稱為 CheckpointNode。
塊:
現在,?因為我們知道,在HDFS的數據被分散在作為的DataNodes塊。讓我們來看看什么是塊,它是如何形成的?
塊只是硬盤驅動器上存儲數據的最小連續位置。通常,在任何文件系統中,您都將數據存儲為塊的集合。同樣,HDFS 將每個文件存儲為塊,這些塊分散在整個 Apache Hadoop 集群中。在 Apache Hadoop 2 中,每個塊的默認大小為 128 MB。x(Apache Hadoop 1?.x 中為64 MB?),您可以根據需要進行配置。
在 HDFS 中,沒有必要將每個文件存儲在配置塊大小(128 MB、256 MB 等)的精確倍數中。讓我們舉個例子,我有一個大小為 514 MB 的文件“example.txt”,如上圖所示。假設我們使用塊大小的默認配置,即128 MB。那么,將創建多少塊?5、對。所述?F?IRST四個塊將是的128 MB。但是,最后一個塊的大小僅為 2 MB。
現在,您一定在想為什么我們需要如此巨大的塊大小,即 128 MB?
好吧,每當我們談論 HDFS 時,我們都會談論巨大的數據集,即 TB 級和 PB 級的數據。因此,如果我們的塊大小為 4 KB,就像在 Linux 文件系統中一樣,我們將擁有太多塊,因此會有太多元數據。所以,管理這些沒有。的塊和元數據,將創造巨大的開銷,這是一件好事,我們不想要的。
當您了解什么是塊時,讓我們在此 HDFS 架構的下一部分中了解這些塊的復制是如何發生的。同時,您可以查看有關 HDFS 架構的視頻教程,其中詳細討論了所有 HDFS 架構概念:
復制管理:
HDFS 提供了一種在分布式環境中將大量數據作為數據塊存儲的可靠方法。這些塊也被復制以提供容錯能力。默認復制因子是 3,它也是可配置的。因此,如下圖所示,每個塊都復制了 3 次并存儲在不同的 DataNode 上(考慮默認復制因子):
因此,如果您使用默認配置在 HDFS 中存儲 128 MB 的文件,您最終將占用 384 MB (3*128 MB) 的空間,因為這些塊將被復制 3 次并且每個副本將駐留在一個不同的數據節點。
注意:?NameNode 定期從 DataNode 收集塊報告以維護復制因子。因此,每當塊被過度復制或復制不足時,NameNode 都會根據需要刪除或添加副本。
機架意識:
無論如何,繼續前進,讓我們更多地討論 HDFS 如何放置副本以及什么是機架感知?同樣,NameNode 還確保所有副本不會存儲在同一機架或單個機架上。它遵循內置的機架感知算法,以減少延遲并提供容錯能力。考慮到復制因子是 3,Rack Awareness Algorithm 說一個塊的第一個副本將存儲在本地機架上,接下來的兩個副本將存儲在不同的(遠程)機架上,但是,在其中的不同 DataNode 上(遠程)機架,如上圖所示。如果您有更多的副本,其余的副本將被放置在隨機 DataNode 上,前提是同一機架上駐留的副本不超過兩個(如果可能)。
這就是實際的 Hadoop 生產集群的樣子。在這里,您有多個裝有 DataNode 的機架:
機架感知的優勢:
那么,現在您會想為什么我們需要機架感知算法?原因是:
提高網絡性能:駐留在不同機架上的節點之間的通信通過交換機進行定向。通常,您會發現同一機架中的機器之間的網絡帶寬比駐留在不同機架中的機器要大。因此,機架感知可幫助您減少不同機架之間的寫入流量,從而提供更好的寫入性能。此外,您將獲得更高的讀取性能,因為您正在使用多個機架的帶寬。
防止數據丟失:即使整個機架因為交換機故障或電源故障而發生故障,我們也不必擔心數據丟失。如果您考慮一下,這將是有道理的,因為據說永遠不要將所有雞蛋放在同一個籃子里。
HDFS 讀/寫架構:
下面我們來談談數據讀寫操作是如何在HDFS上進行的。HDFS 遵循一次寫入 – 多次讀取的理念。因此,您無法編輯已存儲在 HDFS 中的文件。但是,您可以通過重新打開文件來附加新數據。
HDFS 寫入架構:
假設 HDFS 客戶端想要寫入大小為 248 MB 的名為“example.txt”的文件。
假設系統塊大小配置為 128 MB(默認)。因此,客戶端將把文件“example.txt”分成 2 個塊——一個 128 MB(塊 A)和另一個 120 MB(塊 B)。
現在,每當數據寫入 HDFS 時,將遵循以下協議:
首先,HDFS 客戶端將針對兩個塊(例如塊 A 和塊 B)向 NameNode 發出寫入請求。
然后 NameNode 將授予客戶端寫入權限,并提供最終將復制文件塊的 DataNode 的 IP 地址。
DataNode 的 IP 地址的選擇純粹是基于我們之前討論過的可用性、復制因子和機架意識的隨機選擇。
假設復制因子設置為默認值,即 3。因此,對于每個塊,NameNode 將為客戶端提供 (3) 個 DataNode 的 IP 地址列表。該列表對于每個塊都是唯一的。
假設 NameNode 向客戶端提供了以下 IP 地址列表:
對于Block A,列表A = {DataNode 1的IP,DataNode 4的IP,DataNode 6的IP}
對于Block B,設置B = {DataNode 3的IP,DataNode 7的IP,DataNode 9的IP}
每個塊將被復制到三個不同的 DataNode 中,以保持整個集群的復制因子一致。
現在整個數據復制過程將分三個階段進行:
管道的設置
數據流和復制
管道關閉(確認階段)
1.管道設置:
在寫入塊之前,?客戶端確認存在于每個 IP 列表中的 DataNode 是否準備好接收數據。?在這樣做時,客戶端通過連接該塊的相應列表中的各個 DataNode 來為每個塊創建一個管道。讓我們考慮 Block A。 NameNode 提供的 DataNode 列表是:
對于塊 A,列表 A = {DataNode 1 的 IP,DataNode 4 的 IP,DataNode 6 的 IP}。
因此,對于塊 A,客戶端將執行以下步驟來創建管道:
客戶端將選擇列表中的第一個 DataNode(Block A 的 DataNode IP),即 DataNode 1,并將建立 TCP/IP 連接。
客戶端將通知 DataNode 1 準備好接收塊。它還會將接下來的兩個 DataNode(4 和 6)的 IP 提供給應該復制塊的 DataNode 1。
DataNode 1 將連接到DataNode 4。DataNode 1 將通知DataNode 4 準備好接收該塊,并給它DataNode 6 的IP。然后,DataNode 4 將告訴DataNode 6 準備好接收數據。
接下來,就緒確認將遵循相反的順序,即從 DataNode 6 到 4,然后到 1。
最后,DataNode 1 會通知客戶端所有的DataNode 都已準備就緒,客戶端與DataNode 1、4 和6 之間將形成一條管道。
現在管道設置完成,客戶端將最終開始數據復制或流處理。
2. 數據流:
創建管道后,客戶端會將數據推送到管道中。現在,不要忘記在 HDFS 中,數據是根據復制因子復制的。因此,這里塊 A 將存儲到三個 DataNode,因為假定復制因子為 3。繼續前進,客戶端將只將塊 (A) 復制到 DataNode 1。復制總是由 DataNode 順序完成。
因此,復制期間將執行以下步驟:
客戶端將塊寫入 DataNode 1 后,DataNode 1 將連接到 DataNode 4。
然后,DataNode 1 將在管道中推送該塊,并將數據復制到 DataNode 4。
同樣,DataNode 4 將連接到 DataNode 6 并將復制該塊的最后一個副本。
3. 管道關閉或確認階段:
一旦塊被復制到所有三個 DataNode 中,將發生一系列確認以確保客戶端和 NameNode 數據已成功寫入。然后,客戶端將最終關閉管道以結束 TCP 會話。
如下圖所示,確認以相反的順序發生,即從DataNode 6 到4,然后到1。最后,DataNode 1 將三個確認(包括它自己的)推送到管道中并發送給客戶端。客戶端會通知NameNode數據寫入成功。NameNode 將更新其元數據,客戶端將關閉管道。
同理,Block B 也會與 Block A 并行復制到 DataNode 中。 所以,這里需要注意以下幾點:
客戶端將塊A和嵌段B復制到第一數據節點同時。
因此,在我們的例子中,將為每個塊形成兩條流水線,并且上面討論的所有過程都將在這兩條流水線中并行發生。
客戶端將塊寫入第一個 DataNode,然后 DataNode 將依次復制塊。
正如您在上圖中所看到的,每個塊(A 和 B)形成了兩個管道。以下是在其各自管道中為每個塊發生的操作流程:
對于 A 區:1A -> 2A -> 3A -> 4A
對于區塊 B:1B -> 2B -> 3B -> 4B -> 5B -> 6B
HDFS 讀架構:
HDFS Read架構比較容易理解。讓我們再次看上面的例子,HDFS 客戶端現在想要讀取文件“example.txt”。
現在,在讀取文件時將執行以下步驟:
客戶端將聯系 NameNode 請求文件“example.txt”的塊元數據。
NameNode 將返回存儲每個塊(塊 A 和 B)的 DataNode 列表。
在該客戶端之后,將連接到存儲塊的 DataNode。
客戶端開始從 DataNode 并行讀取數據(DataNode 1 的 Block A 和 DataNode 3 的 Block B)。
一旦客戶端獲得了所有需要的文件塊,它就會將這些塊組合成一個文件。
在服務客戶端的讀請求時,HDFS 選擇離客戶端最近的副本。這減少了讀取延遲和帶寬消耗。因此,如果可能,選擇與讀取器節點位于同一機架上的副本。
現在,您應該對 Apache Hadoop HDFS 架構有了一個很好的了解。我知道這里有很多信息,一次獲取可能并不容易。我建議你再讀一遍,我相信這次你會發現它更容易。現在,在我的下一篇博客中,我將討論 Apache Hadoop HDFS 聯合和高可用性架構。
Apache Hadoop
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。