1. HDFS入門
1.1 HDFS基本概念
HDFS是Hadoop Distribute File System的簡稱, 意為: Hadoop分布式檔案系統. 是Hadoop三大核心組件之一, 作為最底層的分布式存盤服務而存在, 是Hadoop領域最基礎的部分.
分布式檔案系統解決的問題就是大資料存盤. 他們是橫跨在多臺計算機上的存盤系統. 分布式系統在大資料時代有著廣泛的應用前景, 他們為存盤和處理超大規模資料提供所需的擴展能力.
1.2 HDFS設計目標
1) 硬體故障是常態. 故障的檢測和自動快速恢復是HDFS的核心架構目標. 例如集群在啟動的時候會進入到安全模式監測block塊的情況, 進行自我備份修復
2) HDFS被設計成適合批量處理, 而不是用戶互動式的. 注重于資料訪問的高吞吐量, 可并行讀取一個檔案.
3) 支持大檔案存盤, 塊存盤 (128M) .
4) 大部分HDFS應用對檔案的要求是write-one-read-many訪問模型, 一次寫入多次讀取. 一個檔案一旦創建, 寫入, 關閉之后就不需要修改了.
5) 移動計算的代價比之移動資料的代價低. 一個應用請求的計算, 離他操作的資料越近越高效, 將計算的任務放在資料存放的位置執行.
6) 在異構的硬體和軟體平臺上的可移植性. 各種應用都可以通過HDFS獲取資料.
2. HDFS重要特性
首先,他是一個檔案系統, 用于存盤檔案, 通過統一的命名空間目錄樹來定位檔案.
其次,他是分布式的, 由很多服務器聯合起來實作功能, 集群中的服務器有各自的角色.
2.1 master / slave架構 (主從架構)
HDFS采用master / slave架構. 一般一個HDFS集群是有一個NameNode和一定數目的DataNode組成. NameNode是集群的主節點. DataNode是集群的從節點. 兩種角色各司其職, 共同協調完成分布式的檔案存盤服務.
2.2 分塊存盤
HDFS中的檔案在物理上是分塊存盤 (block) 的, 塊的大小可以通過配置引數來規定, 默認在Hadoop2.x中是128M.
2.3 名字空間 (NameSpace)
HDFS支持傳統的層次型檔案組織結構, 對外有統一的檔案路徑和命名. 用戶或者應用程式可以創建目錄, 然后將檔案保存在這些目錄里. 檔案系統名字空間的層次結構和大多數現有的檔案系統類似: 用戶可以創建, 洗掉, 移動或重命名檔案.
NameNode負責維護檔案系統的名字空間, 任何對檔案系統名字空間或屬性的修改都會被NameNode記錄下來.
HDFS會給客戶端提供一個統一的抽象目錄樹上, 客戶端通過路徑來訪問檔案, 形如hdfs://namenode:port/dir-a/dir-b/file.data. 要上傳的檔案名和要上傳的位置, 要下載的檔案名和下載的檔案路徑, 統一規范(簡單理解就是我們通過50070能夠看到的檔案架構) .
2.4 NameNode元資料管理
我們把目錄結構及檔案分塊位置資訊叫做元資料. 元資料通常可以理解為修飾資料的資料. NameNode負責維護整個HDFS檔案系統的目錄樹結構, 以及每一個檔案所對應的block塊資訊 (block的id, 以及所在的DataNode服務器) .
HDFS存盤規則是盡可能不存盤小檔案, 因為一條元資料理論150B, 例如10W個1KB的小檔案存盤的硬碟需要100M, 而存盤元資料的記憶體就需要15M.
2.5 DataNode資料存盤
檔案的各個block的具體存盤管理由DataNode節點承擔. 每一個block都可以在多個DataNode上. DataNode需要定時向NameNode匯報自己持有的block資訊.
存盤多個副本 (副本數量可以通過引數設定dfs.replication, 默認是3) .
2.6 副本機制
為了容錯, 檔案的所有block都會有副本. 每個檔案的block大小和副本系數都是可配置的. 應用程式可以指定某個檔案的副本數目. 副本系數可以在檔案創建的時候指定, 也可以在之后改變.
2.7 一次寫入, 多次讀出
HDFS是設計成適應一次寫入, 多次讀出的場景, 且不支持檔案的修改.
所以, HDFS適合用來做大資料分析的底層存盤服務, 并不適合用來做網盤等應用, 因為修改不方便, 延遲大, 網路開銷大, 成本高.
2.8 分塊存盤和副本備份圖

2.9 集群的腦裂
在搭建hadoop的HA集群環境后, 由于兩個namenode的狀態不一, 當active的namenode由于網路等原因出現假死狀態, standby接收不到active的心跳, 因此判斷active的namenode宕機, 但實際上active并沒有死亡. 此時standby的namenode就會切換成active的狀態, 保證服務能夠正常使用. 若原來的namenode復活, 此時在整個集群中就出現2個active狀態的namenode, 該狀態成為腦裂. 腦裂現象可能導致這2個namenode爭搶資源. 從節點不知道該連接哪一臺namenode, 導致節點的資料不統一, 這在企業生產中是不可以容忍的.

3. HDFS檔案限額操作

HDFS檔案的限額配置允許我們以檔案大小或者檔案個數來限制在某個目錄下上傳的檔案數量或者檔案內容總量, 以便達到類似網盤等限制每個用戶允許上傳的最大的檔案的量
3.1 數量限額
執行以下命令進行檔案數量限額
hadoop fs -mkdir -p /user/root/test # 創建hdfs檔案夾
hdfs dfsadmin -setOuota 2 test # 給該檔案夾下面設定最多上傳兩個檔案, 上傳檔案, 發現只能上傳一個檔案
hdfs dfsadmin -clrQuota /user/root/test # 清除檔案數量限制
3.2 空間大小限額
執行以下命令進行空間大小限額
hdfs dfsadmin -setSpaceQuota 4k /user/root/test # 限制空間大小4KB, 上傳超過4KB的檔案提示檔案超過限額.
hdfs dfsadmin -clrSpaceQuota /user/root/test # 清楚空間限額
3.3 查看HDFS檔案限額數量
執行以下命令進行查看HDFS檔案限額數量
hdfs dfs -count -p -h /user/root/test
4. HDFS基本原理
4.1 NameNode概述
1) NameNode是HDFS的核心.
2) NameNode也稱為Master.
3) NameNode僅存盤HDFS的元資料: 檔案系統中所有檔案的目錄樹, 并跟蹤整個集群中的檔案.
4) NameNode不存盤實際資料或資料集. 資料本身實際存盤在DataNode中.
5) NameNode知道HDFS中任何給定檔案的塊串列及其位置. 使用此資訊NameNode知道如何從塊中構建檔案.
6) NameNode并不持久化存盤每個檔案中各個塊所在的DataNode的位置資訊, 這些資訊會在系統啟動時從資料節點重建.
7) NameNode對于HDFS至關重要, 當NameNode關閉時, HDFS / Hadoop集群無法訪問.
8) NameNode是Hadoop集群中的單點故障.
9) NameNode所在機器通常會配置有大量記憶體 (RAM) .

4.2 DataNode概述
1) DataNode負責將實際資料存盤在HDFS中.
2) DataNode也稱為Slave.
3) DataNode和NameNode會保持不斷通信.
4) DataNode啟動時, 他將自己發布到NameNode并匯報自己負責持有的塊串列.
5) 當某個DataNode關閉時, 他不會影響資料或資料集的可用性. NameNode將安排由其他DataNode管理的塊進行副本賦值.
6) DataNode所在機器通常配置有大量的硬碟空間. 因為實際資料存盤在DataNode中.
7) DataNode會定期 (dfs.heartbeat.interval配置項配置, 默認是3秒) 向NameNode發送心跳, 如果NameNode長時間沒有接受到DataNode發送的心跳, NameNode會認為該DataNode失效.
8) block匯報時間間隔取引數dfs.blockreport.intervalMsec, 引數未配置的話默認6小時.
4.3 HDFS作業機制
NameNode負責管理整個檔案系統元資料, DataNode負責管理具體檔案資料塊存盤. SecondaryNameNode協助NameNode進行元資料的備份.
HDFS的內部作業機制對客戶端保持透明, 客戶端請求訪問HDFS都是通過向NameNode申請來進行.

4.4 HDFS寫資料流程

0) DataNode匯報自己的狀態資訊和塊串列
1) 申請上傳檔案, 通過RPC與NameNode建立通訊
2) NameNode檢驗是否有權限上傳, 父目錄是否存在, 有沒有同名的檔案
3) 回傳是否可以上傳, 允許上傳
4) 將檔案切割成大小為128M的block1
5) 開始上傳第一個b1
6) NameNode根據組態檔中指定的備份數量及副本放置策略進行檔案分配, 回傳可用的DataNode的地址, 通過機架感知, 選出DataNode的地址串列, 如node01, node03.
默認存盤策略由BlockPlacementPolicyDefault類支持, 也就是日常生活中提到的最經典的3副本策略.
HDFS集群節點非常多. 機架感知 -- 3副本機制
判斷客戶端所在的位置
1st replica 如果客戶端在當前HDFS集群的一臺上面, 第一個副本會放在這個客戶端所在的機器上.
2nd replica 第二個副本會去找另外一個機架中的一臺服務器, 也就是不同于第一個副本的所在的機架.
3rd replica 第三個副本會在第二個副本所在的機架, 第三個副本會再去找一個節點, 屬于不同的節點.

7) Client請求2臺DataNode中的node01上傳資料 (本質上是一個RPC呼叫, 建立pipeline) , node01收到請求會繼續呼叫node03, 將整個pipeline建立完成, 后逐級回傳客戶端.
8) Client開始想node01上傳第一個block (先從磁盤讀取資料放到一個本地記憶體快取) , 以packet為單位 (默認64KB) , node01收到一個packet就會傳給node03, node01每傳一個packet會放入一個應答佇列等待應答.
9) 資料被分割成一個個packet資料包在pipeline上一次傳輸, 在pipeline反方向上, 備份節點存盤成功后逐個發送ack正確碼, 最終由pipeline中第一個DataNode節點node01將pipeline ack確認碼發送給Client.
10) 依次上傳b2, b3 ......
4.5 HDFS讀資料流程

1) Client向NameNode發起RPC請求, 來確定請求檔案block所在的位置
2) NameNode會視情況回傳檔案的部分或者全部block串列, 對于每個block, NameNode都會回傳含有該block副本的DataNode地址.
3) 這些回傳的DataNode地址, 會按照集群拓撲結構得出DataNode與客戶端的距離, 然后進行排序, 排序兩個規則: 網路拓撲結構中距離Client近的排靠前, 心跳機制中超時匯報的DataNode狀態為STALE, 這樣的排靠后.
4) Client選取排靠前的DataNode來讀取block, 如果客戶端本身就是DataNode, 那么將從本地直接獲取資料.
5) 底層上本質是建立Socket Stream (FSDataInputStream) , 重復的呼叫父類DataInputStream的read方法, 直到這個塊上的資料讀取完畢.
6) 當讀完串列的block后, 若檔案讀取還沒有結束, 客戶端會繼續向NameNode獲取下一批的block串列.
7) 讀取完一個block都會進行checksum驗證, 如果讀取DataNode時出現錯誤, Client會通知NameNode, 然后再從下一個擁有該block副本的DataNode繼續讀取.
8) read方法是并行的讀取block資訊, 不是一塊一塊的讀取. NameNode只是回傳Client請求包含塊的DataNode地址, 并不是回傳請求塊的資料.
9) 最終讀取來所有的block會合并成一個完整的最終檔案.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/39979.html
標籤:大數據
上一篇:PB怎樣備份工程檔案比較好
