第十章 HDFS 深入理解

HDFS的優點和缺點


HDFS的優點

1、可構建在廉價機器上

通過多副本提高可靠性,提供了容錯和恢復機制,服務器節點的宕機是常態 必須理性對待。

2、高容錯性

數據自動保存多個副本,副本丟失後,自動恢復。HDFS的核心設計思想: 分散均勻存儲 + 備份冗餘存儲

3、適合批處理

移動計算而非數據,數據位置暴露給計算框架,海量數據的計算 任務 最終是一定要被切分成很多的小任務進行。

4、適合大數據處理

GB、TB、甚至 PB 級數據,百萬規模以上的文件數量,10K+節點規模。

5、流式文件訪問

一次性寫入,多次讀取,保證數據一致性


HDFS的缺點

1、低延遲數據訪問

比如毫秒級 低延遲與高吞吐率

2、小文件存取

佔用 NameNode 大量內存 150b * 1000W = 15E,1.5G 尋道時間超過讀取時間

3、併發寫入、文件隨機修改

一個文件只能有一個寫者 僅支持 append

HDFS文件系統為什麼不適用於存儲小文件?

這是和 HDFS 系統底層設計實現有關係的,HDFS 本身的設計就是用來解決海量大文件數據的存儲.,他天生喜歡大數據的處理,大文件存儲在 HDFS 中,會被切分成很多的小數據塊,任何一個文件不管有多小,都是一個獨立的數據塊,而這些數據塊的信息則是保存在元數據中的,在第六章 HDFS 基礎 裡面介紹過在 HDFS 集群的namenode 中會存儲元數據的信息,這裡再說一下,元數據的信息主要包括以下 3 部分:

  1)抽象目錄樹

  2)文件和數據塊的映射關係,一個數據塊的元數據大小大約是 150byte

  3)數據塊的多個副本存儲地

而元數據的存儲在磁盤(1和2)和內存中(1、2和3),而服務器中的內存是有上限的,舉個例子:

有 100 個 1M 的文件存儲進入 HDFS 系統,那麼數據塊的個數就是 100 個,元數據的大小就是 100*150byte,消耗了 15000byte 的內存,但是隻存儲了 100M 的數據。

有 1 個 100M 的文件存儲進入 HDFS 系統,那麼數據塊的個數就是 1 個,元數據的大小就是 150byte,消耗量150byte 的內存,存儲量 100M 的數據。

所以說 HDFS 文件系統不適用於存儲小文件。


HDFS的輔助功能

HDFS 作為一個文件系統。有兩個最主要的功能:上傳和下載。而為了保障這兩個功能的完美和高效實現,HDFS 提供了很多的輔助功能


1.心跳機制

普通話講解

1、 Hadoop 是 Master/Slave 結構,Master 中有 NameNode 和 ResourceManager,Slave 中有 Datanode 和 NodeManager

2、 Master 啟動的時候會啟動一個 IPC(Inter-Process Comunication,進程間通信)server 服 務,等待 slave 的鏈接

3、 Slave 啟動時,會主動鏈接 master 的 ipc server 服務,並且每隔 3 秒鏈接一次 master,這 個間隔時間是可以調整的,參數為 dfs.heartbeat.interval,這個每隔一段時間去連接一次的機制,我們形象的稱為心跳。Slave 通過心跳彙報自己的信息給 master,master 也通 過心跳給 slave 下達命令,

4、 NameNode 通過心跳得知 Datanode 的狀態 ,ResourceManager 通過心跳得知 NodeManager 的狀態

5、 如果 master 長時間都沒有收到 slave 的心跳,就認為該 slave 掛掉了。!!!!!


大白話講解

1、DataNode 啟動的時候會向 NameNode 彙報信息,就像釘釘上班打卡一樣,你打卡之後,你領導才知道你今天來上班了,同樣的道理,DataNode 也需要向 NameNode 進行彙報,只不過每次彙報的時間間隔有點短而已,默認是3秒中,

DataNode 向 NameNode 彙報的信息有 2 點,一個是自身 DataNode 的狀態信息,另一個是自身 DataNode 所持有的數據塊的信息。而 DataNode 是不會知道他保存的所有的數據塊副本到底是屬於哪個文件,這些都是存儲在 NameNode 的元數據中。

2、按照規定,每個 DataNode 都是需要向 NameNode 進行彙報。那麼如果從某個時刻開始,某個 DataNode再也不向 NameNode 進行彙報了。 有可能宕機了。因為只要通過網絡傳輸數據,就一定存在一種可能: 丟失 或者 延遲。

3、HDFS 的標準: NameNode 如果連續 10 次沒有收到 DataNode 的彙報。 那麼 NameNode 就會認為該DataNode 存在宕機的可能。

4、DataNode 啟動好了之後,會專門啟動一個線程,去負責給 NameNode 發送心跳數據包,如果說整個DataNode 沒有任何問題,但是僅僅只是當前負責發送信條數據包的線程掛了。NameNode 會發送命令向這個DataNode 進行確認。查看這個發送心跳數據包的服務是否還能正常運行,而為了保險起見,NameNode 會向DataNode 確認 2 遍,每 5 分鐘確認一次。如果 2 次都沒有返回 結果,那麼 NameNode 就會認為 DataNode 已經 GameOver了!!!

最終NameNode判斷一個DataNode死亡的時間計算公式:

timeout = 10 * 心跳間隔時間 + 2 * 檢查一次消耗的時間

心跳間隔時間:dfs.heartbeat.interval 心跳時間:3s 檢查一次消耗的時間:heartbeat.recheck.interval checktime : 5min

最終結果默認是 630s。


2.安全模式

1、HDFS 啟動和關閉順序

HDFS 的啟動和關閉都是先啟動 NameNode,在啟動 DataNode,最後在啟動 secondarynamenode。

2、決定HDFS集群啟動時長的兩個因素

  1)磁盤元數據的大小

  2)datanode 的節點個數

當元數據很大,或者 節點個數很多的時候,那麼 HDFS 的啟動,需要一段很長的時間,那麼在還沒有完全啟動的時候 HDFS 能否對外提供服務?

在 HDFS 的啟動命令 start-dfs.sh 執行的時候,HDFS 會自動進入安全模式。

為了確保用戶的操作是可以高效的執行成功的,在HDFS發現自身不完整的時候,會進入安全模式。保護自己。

在正常啟動之後,如果 HDFS 發現所有的數據都是齊全的,那麼 HDFS 會啟動的退出安全模式。

3、對安全模式進行測試

安全模式常用操作命令

<code># 強制 NameNode 退出安全模式
[bigdata@bigdata101 hadoop-2.7.5]$ hdfs dfsadmin -safemode leave

# 進入安全模式
[bigdata@bigdata101 hadoop-2.7.5]$ hdfs dfsadmin -safemode enter

# 查看安全模式狀態
[bigdata@bigdata101 hadoop-2.7.5]$ hdfs dfsadmin -safemode get

# 等待,一直到安全模式結束
[bigdata@bigdata101 hadoop-2.7.5]$ hdfs dfsadmin -safemode wait/<code>


手工進入安全模式進行測試

1、測試創建文件夾

<code>[bigdata@bigdata101 hadoop-2.7.5]$ hdfs dfsadmin -safemode enter
Safe mode is ON
[bigdata@bigdata101 hadoop-2.7.5]$ hadoop fs -mkdir -p /user/bigdata/safemode
mkdir: Cannot create directory /user/bigdata/safemode. Name node is in safe mode.
[bigdata@bigdata101 hadoop-2.7.5]$ /<code>


2、測試下載文件

<code>[bigdata@bigdata101 hadoop-2.7.5]$ hdfs dfsadmin -safemode get
Safe mode is ON
[bigdata@bigdata101 hadoop-2.7.5]$ hadoop fs -get /user/bigdata/input/new_first.txt

[bigdata@bigdata101 hadoop-2.7.5]$ ls new_first.txt
new_first.txt/<code>


3、測試上傳

<code>[bigdata@bigdata101 hadoop-2.7.5]$ hadoop fs -put new_first.txt /user/bigdata/
put: Cannot create file/user/bigdata/new_first.txt._COPYING_. Name node is in safe mode./<code>


4、得出結論,在安全模式下:

  • 如果一個操作涉及到元數據的修改的話。都不能進行操作。
  • 如果一個操作僅僅只是查詢。那是被允許的。
  • 所謂的安全模式,僅僅只是保護 namenode,而不是保護 datanode。


3.副本存放策略

第一副本:放置在上傳文件的 DataNode 上;如果是集群外提交,則隨機挑選一臺磁盤不太慢、CPU 不太忙的節點上;

第二副本:放置在於第一個副本不同的機架的節點上;

第三副本:與第二個副本相同機架的不同節點上;

如果還有更多的副本:隨機放在節點中;

第十章 HDFS 深入理解


4.負載均衡

負載均衡理想狀態:節點均衡、機架均衡和磁盤均衡。

Hadoop 的 HDFS 集群非常容易出現機器與機器之間磁盤利用率不平衡的情況,例如:當集群內新增、刪除節點,或者某個節點機器內硬盤存儲達到飽和值。當數據不平衡時,Map 任務可能會分配到沒有存儲數據的機器,這將導致網絡帶寬的消耗,也無法很好的進行本地計算。

當 HDFS 負載不均衡時,需要對 HDFS 進行數據的負載均衡調整,即對各節點機器上數據的存儲分佈進行調整。從而,讓數據均勻的分佈在各個 DataNode 上,均衡 IO 性能,防止熱點的發生。進行數據的負載均衡調整,必須要滿足如下原則:

  • 數據平衡不能導致數據塊減少,數據塊備份丟失。
  • 管理員可以中止數據平衡進程。
  • 每次移動的數據量以及佔用的網絡資源,必須是可控的。
  • 數據均衡過程,不能影響 namenode 的正常工作。

負載均衡的原理

數據均衡過程的核心是一個數據均衡算法,該數據均衡算法將不斷迭代數據均衡邏輯,直至集群內數據均衡為止。該數據均衡算法每次迭代的邏輯如下:

第十章 HDFS 深入理解

步驟分析如下:

  1. 數據均衡服務(Rebalancing Server)首先要求 NameNode 生成 DataNode 數據分佈分析報告,獲取每個DataNode 磁盤使用情況。
  2. Rebalancing Server 彙總需要移動的數據分佈情況,計算具體數據塊遷移路線圖。數據塊遷移路線圖,確保網絡內最短路徑。
  3. 開始數據塊遷移任務,Proxy Source Data Node 複製一塊需要移動數據塊。
  4. 將複製的數據塊複製到目標 DataNode 上。
  5. 刪除原始數據塊。
  6. 目標 DataNode 向 Proxy Source Data Node 確認該數據塊遷移完成。
  7. Proxy Source Data Node 向 Rebalancing Server 確認本次數據塊遷移完成。然後繼續執行這個過程,直至集群達到數據均衡標準。

DataNode 分組

在第 2 步中,HDFS 會把當前的 DataNode 節點,根據閾值的設定情況劃分到 Over、Above、Below、Under四個組中。在移動數據塊的時候,Over組、Above組中的塊向Below組、Under組移動。四個組定義如下:

第十章 HDFS 深入理解

  • Over組:此組中的 DataNode 的均滿足

DataNode_usedSpace_percent > Cluster_usedSpace_percent + threshold

  • Above組:此組中的 DataNode 的均滿足

Cluster_usedSpace_percent + threshold > DataNode_ usedSpace _percent

>Cluster_usedSpace_percent

  • Below組:此組中的 DataNode 的均滿足

Cluster_usedSpace_percent > DataNode_ usedSpace_percent > Cluster_ usedSpace_percent – threshold

  • Under組:此組中的 DataNode 的均滿足

Cluster_usedSpace_percent – threshold > DataNode_usedSpace_percent

Hadoop HDFS 數據自動平衡腳本使用方法

在 Hadoop 中,包含一個 start-balancer.sh 腳本,通過運行這個工具,啟動 HDFS 數據均衡服務。該工具可以做到熱插拔,即無須重啟計算機和 Hadoop 服務。HadoopHome/bin目錄下的 start−balancer.sh 腳本就是該任務的啟動腳本。啟動命令為:‘HadoopHome/bin目錄下的 start−balancer.sh 腳本就是該任務的啟動腳本。啟動命令為:‘Hadoop_home/bin/start-balancer.sh –threshold`

影響Balancer的幾個參數:

  • -threshold默認設置:10,參數取值範圍:0-100參數含義:判斷集群是否平衡的閾值。理論上,該參數設置的越小,整個集群就越平衡
  • dfs.balance.bandwidthPerSec默認設置:1048576(1M/S)參數含義:Balancer 運行時允許佔用的帶寬

示例如下:

<code>#啟動數據均衡,默認閾值為 10%
$Hadoop_home/bin/start-balancer.sh

#啟動數據均衡,閾值 5%
bin/start-balancer.sh –threshold 5

#停止數據均衡
$Hadoop_home/bin/stop-balancer.sh/<code>


在 hdfs-site.xml 文件中可以設置數據均衡佔用的網絡帶寬限制


<code>    <property>
   <name>dfs.balance.bandwidthPerSec/<name>
   <value>1048576/<value>
   <description> Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. /<description>
   /<property>/<code>



分享到:


相關文章: