<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # HDFS – Hadoop 分布式文件系統架構教程 > 原文: [https://howtodoinjava.com/hadoop/hdfs-hadoop-distributed-file-system-architecture-tutorial/](https://howtodoinjava.com/hadoop/hdfs-hadoop-distributed-file-system-architecture-tutorial/) HDFS(Hadoop 分布式文件系統)是[**大數據**](//howtodoinjava.com/big-data/hadoop/hadoop-big-data-tutorial/)的存儲位置。 HDFS 的主要目標是即使在存在名稱節點故障,數據節點故障和/或網絡分區([**CAP 定理**](//howtodoinjava.com/2015/07/13/brewers-cap-theorem-in-simple-words/)中的“P”)等故障的情況下,也能可靠地存儲數據。 本教程旨在研究將 HDFS 實現到分布式集群環境中涉及的不同組件。 ```java Table of Contents HDFS Architecture NameNode DataNodes CheckpointNode BackupNode File System Snapshots File Operations Read/Write operation Block Placement Replication management Balancer Block Scanner ``` ## HDFS 架構 HDFS 是 Hadoop 的文件系統組件。 您可以可視化普通文件系統(例如 FAT 和 NTFS),但可以處理非常大的數據集/文件。 默認塊大小為 64 MB(HDFS 2 中為 128 MB)。 因此,當您在其中存儲大文件時,HDFS 的性能最佳。 小文件實際上會導致內存浪費。 在 HDFS 中,數據存儲為兩種形式,即**實際數據**和**元數據**(文件大小,塊位置,時間戳等)。 **元數據存儲在名稱節點中,應用數據存儲在數據節點**中。 所有服務器均已完全連接,并使用基于 TCP 的協議相互通信。 通過在多個數據節點之間分布存儲和計算,集群可以水平增長,同時保持成本有限,因為這些節點是簡單的[商業硬件](https://en.wikipedia.org/wiki/Commodity_computing)。 #### 名稱節點 **名稱節點存儲元數據。** 當您將大文件存儲到 HDFS 中時,它會分成多個塊(通常為 128 MB,但用戶可以覆蓋它)。 然后,將每個塊分別存儲到多個數據節點中(默認值為 3)。 名稱節點是在稱為 **inode** 的數據結構中存儲文件塊到數據節點的映射(文件數據的物理位置),文件權限,修改和訪問時間戳,名稱空間和磁盤空間配額的組件。 任何想要讀取文件的客戶端都將首先與名稱節點聯系以獲取數據塊的位置,然后再從距離該客戶端最近的數據節點中讀取塊內容。 類似地,在寫入數據時,客戶端請求名稱節點提名一組三個數據節點來寫入塊副本。 然后,客戶端以管道方式(*我們將看到如何完成*)將數據寫入數據節點。 任何群集一次只能具有一個**名稱節點**。 HDFS **將整個名稱空間保留在 RAM** 中,以便更快地訪問客戶端程序。 并定期將這些數據以映像,檢查點和日志的形式同步到持久化文件系統中。 內存中**索引節點**數據和屬于每個文件的塊列表組成了命名空間的元數據,稱為**映像**。 圖像的持久記錄(存儲在本機文件系統中)稱為**檢查點**。 本地主機的本機文件系統中稱為**日志**的映像的修改日志。 在重新啟動期間,名稱節點通過讀取檢查點并重播日志來還原名稱空間。 #### 數據節點 **數據節點存儲實際的應用數據。** 數據節點中的每個數據塊在單獨的文件中都有兩部分,即數據本身及其元數據,包括塊數據的校驗和和塊的生成標記。 在啟動期間,每個數據節點都連接到名稱節點并執行**握手**以驗證名稱空間 ID 和數據節點的軟件版本。 如果其中一個與名稱節點中存在的記錄不匹配,則數據節點將自動關閉。 **命名空間 ID 是整個集群**的單個唯一 ID,當將節點格式化為包含在集群中時,命名空間 ID 將存儲到所有節點中。 **軟件版本是 HDFS** 的版本,其經過驗證可防止由于新版本功能的更改而導致任何數據丟失。 允許新初始化的,沒有任何名稱空間 ID 的數據節點加入群集并接收群集的名稱空間 ID。 也就是它擁有自己的唯一存儲 ID。 握手后,數據節點**向名稱節點注冊**并發送其**塊報告**。 塊報告包含數據節點托管的每個塊副本的塊 ID,生成標記和長度。 第一個阻止報告在數據節點注冊后立即發送。 隨后的塊報告每小時發送一次,并為數據節點提供有關塊副本在群集上的位置的最新視圖。 為了通知其實時狀態,所有數據節點都會向名稱節點發送**心跳**。 默認的心跳間隔為三秒。 如果名稱節點在十分鐘內未從數據節點接收到心跳,則名稱節點會認為數據節點停止服務,并且該數據節點托管的塊副本不可用。 然后,名稱節點計劃在其他數據節點上創建這些塊的新副本。 來自數據節點的心跳還攜帶有關總存儲容量,正在使用的存儲部分以及當前正在進行的數據傳輸數量的信息。 這些統計信息用于名稱節點的空間分配和負載平衡決策。 名稱節點從不直接調用數據節點。 它使用對心跳的答復將指令發送到數據節點,例如,將塊復制到其他節點,刪除本地塊副本,重新注冊或關閉該節點或發送即時塊報告。 這些命令對于維護整個系統的完整性非常重要,因此即使在大型集群上也要保持心跳頻繁是至關重要的。 名稱節點每秒可以處理數千個心跳,而不會影響其他名稱節點操作。 #### 檢查點節點 檢查點節點通常是群集中的另一個名稱節點(托管在另一臺計算機中,并且不直接為客戶端提供服務)。 **檢查點節點從名稱節點下載當前的檢查點和日志文件,在本地合并它們,并將新的檢查點返回給名稱節點。** 此時,名稱節點存儲此新檢查點并清空其擁有的現有日志。 創建定期檢查點是保護文件系統元數據的一種方法。 如果名稱空間映像或日志的所有其他持久化副本在名稱節點中不可用,則系統可以從最近的檢查點開始。 #### 備份節點 **備份節點能夠創建定期檢查點,但除此之外,它還維護文件系統名稱空間的內存中最新映像,該映像始終與名稱節點**的狀態同步。 名稱節點以更改流的形式通知備份節點所有事務。 由于名稱節點和備份節點都將所有信息都存儲在內存中,因此兩者的內存要求相似。 如果名稱節點發生故障,則備份節點在內存中的映像和磁盤上的檢查點將記錄最新的名稱空間狀態。 可以將備份節點視為**只讀名稱節點**。 它包含除塊位置之外的所有文件系統元數據信息。 它可以執行常規名稱節點的所有操作,這些操作不涉及名稱空間的修改或塊位置的知識。 這意味著當名稱節點發生故障時,備份節點不會立即保留到目前為止尚未保留的所有最新更新。 請注意, **備份節點不是輔助名稱節點**(如果活動名稱節點失敗,則是備用名稱節點),它不會受理客戶端對讀/寫文件的請求。 輔助節點是 HDFS 2.x([Apache YARN](https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html))的功能,我們將在單獨的教程中介紹。 #### 文件系統快照 **快照是整個群集的映像,將其保存以防止在系統升級時丟失任何數據**。 實際的數據文件不是該映像的一部分,因為它將導致整個群集的存儲區域加倍。 當管理員請求快照時,名稱節點選擇退出的檢查點文件并將所有日志日志合并到該文件中并存儲到持久文件系統中。 同樣,所有數據節點復制其**目錄信息,并將硬鏈接鏈接到數據塊**并存儲到其中。 群集故障時將使用此信息。 ## 文件操作 首先,所有組件將構建 HDFS 文件系統,并以連續的方式發揮其作用,以保持群集的健康。 現在,讓我們嘗試了解**在 HDFS 集群環境**中如何進行文件讀/寫操作。 #### 讀/寫操作 如果要將數據寫入 HDFS,則只需**創建一個文件,然后將數據寫入該文件**。 HDFS 為您管理了上述所有復雜性。 在讀取數據時,給它一個文件名; 并開始從中讀取數據。 要學習的重要一件事是**一旦在 HDFS** 中寫入,就無法修改數據。 您只能向其附加新數據。 或者,只需刪除該文件并寫入一個新文件來代替它。 想要寫入數據的客戶端應用首先需要詢問“**寫租約**”(類似于寫鎖)。 客戶端獲得寫租約后,其他客戶端無法寫入該文件,直到完成第一個程序或租約到期為止。 編寫器客戶端通過將心跳發送到名稱節點來定期續訂租約。 文件關閉后,租約將被撤銷,其他程序可以請求對此文件進行寫租約。 租約期限受軟限制和硬限制的約束。 在軟限制到期之前,編寫者可以確定對該文件的獨占訪問權限。 如果軟限制到期并且客戶端無法關閉文件或續訂租約,則另一個客戶端可以搶占該租約。 如果硬限制到期后(一小時)并且客戶端未能續訂租約,則 HDFS 會假定客戶端已退出,并將代表編寫者自動關閉文件并恢復租約。 編寫者的租約不會阻止其他客戶讀取文件; 一個文件可能有許多并發讀取器。 將數據寫入 HDFS 文件后,HDFS 不提供任何保證,除非關閉文件,否則新讀取器可以看到該數據。 如果用戶應用需要可見性保證,則可以顯式調用“`hflush`”操作。 數據以管道方式寫入,如下所示。 ![Write Pipeline in HDFS](https://img.kancloud.cn/15/b7/15b75c2f3175c08bc732672f7bb23704_592x530.png) HDFS 中的編寫管道 上圖描繪了三個數據節點(DN)的流水線和五個數據包的塊。 **客戶端僅寫入第一個數據節點,然后該數據節點將數據傳遞給第二個數據節點,依此類推。** 這樣,所有節點都參與數據寫入。 客戶端打開要讀取的文件時,它將從名稱節點獲取塊列表和每個塊副本的位置。 每個塊的位置按它們與閱讀器的距離排序。 當讀取塊的內容時,**客戶端首先嘗試最接近的副本**。 如果讀取嘗試失敗,則客戶端將依次嘗試下一個副本。 #### 塊放置 選擇用于寫入數據的節點時,名稱節點遵循副本管理策略。 默認的 HDFS 副本放置策略如下: 1. 沒有數據節點包含任何塊的一個以上副本。 2. 如果集群上有足夠的機架,則沒有一個機架包含同一塊的兩個以上副本。 #### 復制管理 名稱節點的一項主要職責是,確保所有數據塊均具有適當數量的副本。 在匯總來自數據節點的塊報告期間,名稱節點會檢測到某個塊的復制不足或過度。 當塊變得過度復制時,名稱節點選擇要刪除的副本。 當塊復制不足時,會將其放入復制優先級隊列中,以創建該數據塊的更多副本。 只有一個副本的塊具有最高優先級。 后臺線程定期掃描復制隊列的頭部,以根據上述塊放置策略決定將新副本放置在何處。 #### 平衡器 HDFS 塊放置策略未考慮數據節點磁盤空間利用率。 將新節點添加到群集時,也會發生不平衡。 平衡器是**平衡 HDFS 群集**上磁盤空間使用情況的工具。 該工具被部署為可以由集群管理員運行的應用。 它將副本從利用率較高的數據節點移到利用率較低的數據節點。 在選擇要移動的副本并確定其目的地時,平衡器保證該決定不會減少副本數量或機架數量。 平衡器通過最小化機架間數據復制來優化平衡過程。 如果平衡器確定需要將副本 A 移動到其他機架,并且目標機架恰好具有相同塊的副本 B,則將從副本 B 復制數據,而不是副本 A。 #### 區塊掃描器 每個數據節點運行一個塊掃描器,該掃描器定期**掃描其塊副本并驗證存儲的校驗和與塊數據**相匹配。 另外,如果客戶端讀取了完整的塊并且校驗和驗證成功,它將通知數據節點。 數據節點將其視為副本的驗證。 每當讀取客戶端或塊掃描器檢測到損壞的塊時,它都會通知名稱節點。 名稱節點將副本標記為已損壞,但不會立即計劃刪除副本。 相反,它開始復制該塊的良好副本。 僅當良好的副本數達到塊的復制因子時,才計劃刪除損壞的副本。 這就是 HDFS 非常復雜的介紹。 讓我知道你的問題。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看