1. 程式人生 > >hadoop之儲存篇

hadoop之儲存篇

目錄:

  • 叢集規劃
  • HDFS HA
  • 冒煙測試
  • 功能特性

 叢集規劃:

  • 負載型別
  • 容量規劃
  • 可擴充套件性
  • 角色分離
  • 管理節點
    • Master節點
    • Worker節點
    • 邊緣節點

 HDFS HA(高可用)

架構原理見下圖:

 

冒煙測試:

詳細說明參見之前的部落格:https://www.cnblogs.com/huxinga/p/9627084.html

功能特性:

  1. HDFS Balancer
  2. 快照 Snapshots
  3. 配額 Quota
  4. 許可權 ACLs
  5. 儲存策略
  6. 集中快取管理
  7. 機架感知
  8. Erasure Coding
  9. Memory as Storage
  10. Short-Circuit Local Reads

1,HDFS Balancer

    balancer是當hdfs叢集中一些datanodes的儲存要寫滿了或者有空白的新節點加入叢集時,用於均衡hdfs叢集磁碟使用量的一個工具。

 Hadoop的HDFS叢集非常容易出現機器與機器之間磁碟利用率不平衡的情況,比如叢集中新增新的資料節點。當HDFS出現不平衡狀況的時候,將引發很多問題,比如MR程式無法很好地利用本地計算的優勢,機器之間無法達到更好的網路頻寬使用率,機器磁碟無法利用等等。可見,保證HDFS中的資料平衡是非常重要的。在Hadoop中,包含一個Balancer程式,通過執行這個程式,可以使得HDFS叢集達到一個平衡的狀態

參考命令:

hdfs balancer
hdfs dfsadmin [-setBalancerBandwidth <bandwidth in bytes per second>]
 <property>
    <name>dfs.datanode.balance.bandwidthPerSec</name>
    <value>6250000</value>
 </property>

2,快照 snapshots

   HDFS快照是檔案系統的只讀時間點的副本。可以在檔案系統的子樹或整個檔案系統上拍攝快照。快照的一些常見⽤例是資料備份,防⽌使用者錯誤和災難恢復。

   HDFS中可以對目錄建立Snapshot,建立之後不管後續目錄發生什麼變化,都可以通過snapshot找回原來的檔案和目錄結構。

實現原理:

   實現上是通過在每個目標節點下面建立snapshot節點,後續任何子節點的變化都會同步記錄到snapshot上。例如刪除子節點下面的檔案,並不是直接檔案元資訊以及資料刪除,而是將他們移動到snapshot下面。這樣後續還能夠恢復回來。另外snapshot儲存是一個完全的現場,不僅是刪除的檔案還能找到,新建立的檔案也無法看到。後一種效果的實現是通過在snapshot中記錄哪些檔案是新建立的,檢視列表的時候將這些檔案排除在外。
參考命令

# 為指定目錄開啟快照功能 
hdfs dfsadmin -allowSnapshot <path> 
# 列出開啟了快照功能的目錄 
hdfs lsSnapshottableDir 
# 建立快照 
hdfs dfs -createSnapshot <path> [<snapshotName>] 
# ⽐較兩個快照之間的區別 
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot> 
# 列出快照內的⽂檔案 
hdfs dfs -ls /foo/.snapshot 
# 從快照中恢復資料。
此處使用了了preserve選項來保留時間戳、所有權、許可權、ACL 和 XAttrs擴充套件屬性 
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp

例子分析:

我們通過一個例子來分析整個snapshot的實現細節:
1. 檔案目錄樹如下圖所示,並且我們已經通過命令啟動了a的snapshot功能,結構如下圖所示:

 

圖中.snapshot是虛擬節點,儲存了所有的snapshot列表,其中diff中還儲存當前節點下面的變化,一個snapshot對應於一個diff.要注意的是snapshot中可以被多個目錄的diff引用,後續會進行說明。
2. 當我們執行createSnapshot命令時,結果如下:

3. 當刪除檔案e的時候

    不論是刪除一個檔案還是一個目錄,只要是直接子節點,都會將節點轉換為快照版本.例如e會變成INodeFileWithSnapshot,在a的DirectoryDiff中ChildDiff中deleted列表中將會包含e,而在a的正常節點下會被刪除。目錄節點的處理同樣。

4. 刪除孫子節點是的情況

    處理這種節點的原則是:先將孫子節點轉變為Snapshot版本,然後將父節點變為snapshot版本,同時將孫子節點版本加入到直接父節點的diff列表中。為了能夠通過同一個snapshot找到當時的檔案,需要將新的diff指向到老的snapshot版本上。圖中d節點是INodeDirectoryWithSnapshot(不是INodeDiretorySnapshottable, 本身不允許在d上建立snapshot)

3,配額 Quata

Name Quotas :
Name Quota 是該目錄下所有檔案和目錄總的數量的硬限制。如果超出配額,檔案和目錄建立將失敗。配額為1會強制目錄保持為空。 重新命名後依然有效
Space Quotas :
Space Quota 是該目錄下所有檔案使用的位元組數的硬限制。如果配額不允許寫入完整塊,則塊分配將失敗。塊的每個副本都會計入配額。 最好設定空間大小為快的整數倍。空間配額為0時可以建立檔案,但不能向檔案中寫入內容,單位為BYTE。
儲存型別配額 :
儲存型別配額是該目錄中檔案使用特定儲存型別(SSD,DISK,ARCHIVE)的硬限制

參考命令:

hdfs dfsadmin -setQuota <N> <directory>...<directory> 
hdfs dfsadmin -clrQuota <directory>...<directory> 
hdfs dfsadmin -setSpaceQuota <N> <directory>...<directory> 
hdfs dfsadmin -clrSpaceQuota <directory>...<directory> 
hdfs dfsadmin -setSpaceQuota <N> -storageType <storagetype> <directory>...<directory> hdfs dfsadmin -clrSpaceQuota -storageType <storagetype> <directory>...<directory> 
hadoop fs -count -q [-h] [-v] [-t [comma-separated list of storagetypes]] <directory>...<directory

4,HDFS ACLs