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的啟動和關閉都是先啟動NameNode,在啟動DataNode,最后在啟動secondarynamenode。
2、決定HDFS集群的啟動時長會有兩個因素:
1)磁盤元數據的大小
2)datanode的節點個數
當元數據很大,或者 節點個數很多的時候,那么HDFS的啟動,需要一段很長的時間,那么在還沒有完全啟動的時候HDFS能否對外提供服務?
在HDFS的啟動命令start-dfs.sh執行的時候,HDFS會自動進入安全模式
為了確保用戶的操作是可以高效的執行成功的,在HDFS發現自身不完整的時候,會進入安全模式。保護自己。
在正常啟動之后,如果HDFS發現所有的數據都是齊全的,那么HDFS會啟動的退出安全模式
3、對安全模式進行測試
安全模式常用操作命令:
hdfs dfsadmin -safemode leave //強制 NameNode 退出安全模式 hdfs dfsadmin -safemode enter //進入安全模式 hdfs dfsadmin -safemode get //查看安全模式狀態 hdfs dfsadmin -safemode wait //等待,一直到安全模式結束
手工進入安全模式進行測試
1、測試創建文件夾
[hadoop@hadoop1 ~]$ hdfs dfsadmin -safemode enter Safe mode is ON [hadoop@hadoop1 ~]$ hadoop fs -mkdir -p /xx/yy/zz mkdir: Cannot create directory /xx/yy/zz. Name node is in safe mode. [hadoop@hadoop1 ~]$
2、測試下載文件
[hadoop@hadoop1 ~]$ ls apps data [hadoop@hadoop1 ~]$ hdfs dfsadmin -safemode get Safe mode is ON [hadoop@hadoop1 ~]$ hadoop fs -get /aa/1.txt ~/1.txt [hadoop@hadoop1 ~]$ ls 1.txt apps data [hadoop@hadoop1 ~]$
3、測試上傳
[hadoop@hadoop1 ~]$ hadoop fs -put 1.txt /a/xx.txt put: Cannot create file/a/xx.txt._COPYING_. Name node is in safe mode. [hadoop@hadoop1 ~]$
4、得出結論,在安全模式下:
如果一個操作涉及到元數據的修改的話。都不能進行操作
如果一個操作僅僅只是查詢。那是被允許的。
所謂的安全模式,僅僅只是保護namenode,而不是保護datanode
3.副本存放策略
第一副本:放置在上傳文件的DataNode上;如果是集群外提交,則隨機挑選一台磁盤不太慢、CPU不太忙的節點上;
第二副本:放置在於第一個副本不同的機架的節點上;
第三副本:與第二個副本相同機架的不同節點上;
如果還有更多的副本:隨機放在節點中;
4.負載均衡
負載均衡理想狀態:節點均衡、機架均衡和磁盤均衡。
Hadoop的HDFS集群非常容易出現機器與機器之間磁盤利用率不平衡的情況,例如:當集群內新增、刪除節點,或者某個節點機器內硬盤存儲達到飽和值。當數據不平衡時,Map任務可能會分配到沒有存儲數據的機器,這將導致網絡帶寬的消耗,也無法很好的進行本地計算。
當HDFS負載不均衡時,需要對HDFS進行數據的負載均衡調整,即對各節點機器上數據的存儲分布進行調整。從而,讓數據均勻的分布在各個DataNode上,均衡IO性能,防止熱點的發生。進行數據的負載均衡調整,必須要滿足如下原則:
- 數據平衡不能導致數據塊減少,數據塊備份丟失
- 管理員可以中止數據平衡進程
- 每次移動的數據量以及占用的網絡資源,必須是可控的
- 數據均衡過程,不能影響namenode的正常工作
負載均衡的原理
數據均衡過程的核心是一個數據均衡算法,該數據均衡算法將不斷迭代數據均衡邏輯,直至集群內數據均衡為止。該數據均衡算法每次迭代的邏輯如下:
步驟分析如下:
- 數據均衡服務(Rebalancing Server)首先要求 NameNode 生成 DataNode 數據分布分析報告,獲取每個DataNode磁盤使用情況
- Rebalancing Server匯總需要移動的數據分布情況,計算具體數據塊遷移路線圖。數據塊遷移路線圖,確保網絡內最短路徑
- 開始數據塊遷移任務,Proxy Source Data Node復制一塊需要移動數據塊
- 將復制的數據塊復制到目標DataNode上
- 刪除原始數據塊
- 目標DataNode向Proxy Source Data Node確認該數據塊遷移完成
- Proxy Source Data Node向Rebalancing Server確認本次數據塊遷移完成。然后繼續執行這個過程,直至集群達到數據均衡標准
DataNode分組
在第2步中,HDFS會把當前的DataNode節點,根據閾值的設定情況划分到Over、Above、Below、Under四個組中。在移動數據塊的時候,Over組、Above組中的塊向Below組、Under組移動。四個組定義如下:
- 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運行時允許占用的帶寬
示例如下:
#啟動數據均衡,默認閾值為 10% $Hadoop_home/bin/start-balancer.sh #啟動數據均衡,閾值 5% bin/start-balancer.sh –threshold 5 #停止數據均衡 $Hadoop_home/bin/stop-balancer.sh
在hdfs-site.xml文件中可以設置數據均衡占用的網絡帶寬限制
<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>