怎么设置某个用户生成hdfs文件的权限_HDFS简明入门教程
本文詳細講解作為 HBase 底層存儲的分布式文件系統 HDFS 的原理。
HDFS ( Hadoop Distributed File System)即 Hadoop 分布式文件系統,它的設計目標是把超大數據集存儲到集群中的多臺普通商用計算機上,并提供高可靠性和高吞吐量的服務。
HDFS 是參考 Google 公司的 GFS 實現的,不管是 Google 公司的計算平臺還是 Hadoop 計算平臺,都是運行在大量普通商用計算機上的,這些計算機節點很容易出現硬件故障,而這兩種計算平臺都將硬件故障作為常態,通過軟件設計來保證系統的可靠性。
例如,HDFS 的數據是分塊地存儲在每個節點上,當某個節點出現 故障時,HDFS 相關組件能快速檢測節點故障并提供容錯機制完成數據的自動恢復。
HDFS 的基本架構
HDFS 主要由 3 個組件構成,分別是 NameNode、SecondaryNameNode 和 DataNode。
HDFS 是以 Master/Slave 模式運行的,其中,NameNode 和 SecondaryNameNode 運行在 Master 節點 上,而 DataNode 運行在 Slave 節點上,所以 HDFS 集群一般由一個 NameNode、一個 SecondaryNameNode 和許多 DataNode 組成,其架構如下圖所示。
在 HDFS 中,文件是被分成塊來進行存儲的,一個文件可以包含許多個塊,每個塊存儲在不同的 DataNode 中。從上圖中可知,當一個客戶端請求讀取一個文件時,它需要先從 NameNode 中獲取文件的元數據信息,然后從對應的數據節點上并行地讀取數據塊。
下面介紹 HDFS 架構中 NameNode、SecondaryNameNode 和 DataNode 的功能。
NameNode
NameNode 是主服務器,負責管理文件系統的命名空間以及客戶端對文件的訪問。當客戶端請求數據時,僅僅從 NameNode 中獲取文件的元數據信息,具體的數據傳輸不經過 NameNode,而是直接與具體的 DataNode 進行交互。
這里文件的元數據信息記錄了文件系統中的文件名和目錄名,以及它們之間的層級關系,同時也記錄了每個文件目錄的所有者及其權限,甚至還記錄每個文件由哪些塊組成,這些元數據信息記錄在文件 fsimage 中,當系統初次啟動時,NameNode 將讀取 fsimage 中的信息并保存到內存中。
這些塊的位置信息是由 NameNode 啟動后從每個 DataNode 獲取并保存在內存當中的,這樣既減少了 NameNode 的啟動時間,又減少了讀取數據的查詢時間,提高了整個系統的效率。
SecondaryNameNode
從字面上來看,SecondaryNameNode 很容易被當作是 NameNode 的備份節點,其實不然??梢酝ㄟ^下圖看 HDFS 中 SecondaryNameNode 的作用。
NameNode 管理著元數據信息,元數據信息會定期保存到 edits 和 fsimage 文件中。其中的 edits 保存操作日志信息,在 HDFS 運行期間,新的操作日志不會立即與 fsimage 進行合并,也不會存到 NameNode 的內存中,而是會先寫到 edits 中。
當 edits 文件達到一定域值或間隔一段時間后觸發 SecondaryNameNode 進行工作,這個時間點稱為 checkpoint。
SecondaryNameNode 的角色就是定期地合并 edits 和 fsimage 文件,其合并步驟如下。
最終 fsimage 保存的是上一個 checkpoint 的元數據信息,而 edits 保存的是從上個 checkpoint 開始發生的 HDFS 元數據改變的信息。
DataNode
DataNode 是 HDFS 中的工作節點,也是從服務器,它負責存儲數據塊,也負責為客戶端提供數據塊的讀寫服務,同時也響應 NameNode 的相關指令,如完成數據塊的復制、刪除等。
另外, DataNode 會定期發送心跳信息給 NameNode,告知 NameNode 當前節點存儲的文件塊信息。當客戶端給 NameNode 發送讀寫請求時,NameNode 告知客戶端每個數據塊所在的 DataNode 信息,然后客戶端直接與 DataNode 進行通信,減少 NameNode 的系統開銷。
當 DataNode 在執行塊存儲操作時,DataNode 還會與其他 DataNode 通信,復制這些塊到其他 DataNode 上實現冗余。
HDFS 的分塊機制和副本機制
在 HDFS 中,文件最終是以數據塊的形式存儲的,而副本機制極大程度上避免了宕機所造成的數據丟失,可以在數據讀取時進行數據校驗。
分塊機制
HDFS 中數據塊大小默認為 64MB,而一般磁盤塊的大小為 512B,HDFS 塊之所以這么大,是為了最小化尋址開銷。
如果塊足夠大,從磁盤傳輸數據的時間會明顯大于尋找塊的地址的時間,因此,傳輸一個由多個塊組成的大文件的時間取決于磁盤傳輸速率。
隨著新一代磁盤驅動器傳輸速率的提升,尋址開銷會更少,在更多情況下 HDFS 使用更大的塊。當然塊的大小不是越大越好,因為 Hadoop 中一個 map 任務一次通常只處理一個塊中的數據,如果塊過大,會導致整體任務數量過小,降低作業處理的速度。
HDFS 按塊存儲還有如下好處。
1) 文件可以任意大,不會受到單個節點的磁盤容量的限制。理論上講,HDFS 的存儲容量是無限的。
2) 簡化文件子系統的設計。將系統的處理對象設置為塊,可以簡化存儲管理,因為塊大小固定,所以每個文件分成多少個塊,每個 DataNode 能存多少個塊,都很容易計算。同時系統中 NameNode 只負責管理文件的元數據,DataNode 只負責數據存儲,分工明確,提高了系統的效率。
3) 有利于提高系統的可用性。HDFS 通過數據備份來提供數據的容錯能力和高可用性,而按照塊的存儲方式非常適合數據備份。同時塊以副本方式存在多個 DataNode 中,有利于負載均衡,當某個節點處于繁忙狀態時,客戶端還可以從其他節點獲取這個塊的副本。
副本機制
HDFS 中數據塊的副本數默認為 3,當然可以設置更多的副本數,這些副本分散存儲在集群中,副本的分布位置直接影響 HDFS 的可靠性和性能。
一個大型的分布式文件系統都是需要跨多個機架的,如下圖中,HDFS 涉及兩個機架。
如果把所有副本都存放在不同的機架上,可以防止機架故障從而導致數據塊不可用,同時在多個客戶端訪問文件系統時很容易實現負載均衡。如果是寫數據,各個數據塊需要同步到不同機架上,會影響寫數據的效率。
在 HDFS 默認 3 個副本情況下,會把第一個副本放到機架的一個節點上,第二副本放在同一 個機架的另一個節點上,第三個副本放在不同的機架上。
這種策略減少了跨機架副本的個數,提高了數據塊的寫性能,也可以保證在一個機架出現故障時,仍然能正常運轉。
HDFS 的讀寫機制
前面講到,客戶端讀、寫文件是與 NameNode 和 DataNode 通信的,下面詳細介紹 HDFS 中讀寫文件的過程。
讀文件
HDFS 通過 RPC 調用 NameNode 獲取文件塊的位置信息,并且對每個塊返回所在的 DataNode 的地址信息,然后再從 DataNode 獲取數據塊的副本。
HDFS 讀文件的過程如圖所示。
操作步驟如下:
在客戶端獲得 NameNode 關于每個數據塊的信息后,客戶端會根據網絡拓撲選擇與它最近的 DataNode 來讀取每個數據塊。當與 DataNode 通信失敗時,它會選取另一個較近的 DataNode,同時會對出故障的 DataNode 做標記,避免與它重復通信,并發送 NameNode 故障節點的信息。
寫文件
當客戶端發送寫文件請求時,NameNode 負責通知 DataNode 創建文件,在創建之前會檢查客戶端是否有允許寫入數據的權限。通過檢測后,NameNode 會向 edits 文件寫入一條創建文件的操作記錄。
HDFS 中寫文件的過程如圖所示。
操作步驟如下:
1) 客戶端在向 NameNode 發送寫請求之前,先將數據寫入本地的臨時文件中。
2) 待臨時文件塊達到系統設置的塊大小時,開始向 NameNode 請求寫文件。
3) NameNode 在此步驟中會檢查集群中每個 DataNode 狀態信息,獲取空閑的節點,并在檢查客戶端權限后創建文件,返回客戶端一個數據塊及其對應 DataNode 的地址列表。列表中包含副本存放的地址。
4) 客戶端在獲取 DataNode 相關信息后,將臨時文件中的數據塊寫入列表中的第一個 DataNode,同時第一個 DataNode 會將數據以副本的形式傳送至第二個 DataNode,第二個節點也會將數據傳送至第三個 DataNode。
DataNode 以數據包的形式從客戶端接收數據,并以流水線的形式寫入和備份到所有的 DataNode 中,每個 DataNode 收到數據后會向前一個節點發送確認信息。 最終數據傳輸完畢,第一個 DataNode 會向客戶端發送確認信息。
5) 當客戶端收到每個 DataNode 的確認信息時,表示數據塊已經持久化地存儲在所有 DataNode 當中,接著客戶端會向 NameNode 發送確認信息。如果在第(4 )步中任何一個 DataNode 失敗,客戶端會告知 NameNode,將數據備份到新的 DataNode 中。
總結
以上是生活随笔為你收集整理的怎么设置某个用户生成hdfs文件的权限_HDFS简明入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker centos7_cento
- 下一篇: 用python向mongodb插入数据_