Hadoop学习之路(九)HDFS深入理解
?HDFS的優(yōu)點和缺點
HDFS的優(yōu)點
1、可構(gòu)建在廉價機器上
通過多副本提高可靠性,提供了容錯和恢復(fù)機制
服務(wù)器節(jié)點的宕機是常態(tài)? ?必須理性對象
?
2、高容錯性
數(shù)據(jù)自動保存多個副本,副本丟失后,自動恢復(fù)
HDFS的核心設(shè)計思想:? 分散均勻存儲 + 備份冗余存儲
3、適合批處理
移動計算而非數(shù)據(jù),數(shù)據(jù)位置暴露給計算框架
海量數(shù)據(jù)的計算 任務(wù) 最終是一定要被切分成很多的小任務(wù)進行
?
4、適合大數(shù)據(jù)處理
GB、TB、甚至 PB 級數(shù)據(jù),百萬規(guī)模以上的文件數(shù)量,10K+節(jié)點規(guī)模
5、流式文件訪問
一次性寫入,多次讀取,保證數(shù)據(jù)一致性
HDFS的缺點
不適合以下操作
1、低延遲數(shù)據(jù)訪問
比如毫秒級 低延遲與高吞吐率
2、小文件存取
占用 NameNode 大量內(nèi)存 150b* 1000W = 15E,1.5G 尋道時間超過讀取時間
3、并發(fā)寫入、文件隨機修改
一個文件只能有一個寫者 僅支持 append
拋出問題:HDFS文件系統(tǒng)為什么不適用于存儲小文件?
這是和HDFS系統(tǒng)底層設(shè)計實現(xiàn)有關(guān)系的,HDFS本身的設(shè)計就是用來解決海量大文件數(shù)據(jù)的存儲.,他天生喜歡大數(shù)據(jù)的處理,大文件存儲在HDFS中,會被切分成很多的小數(shù)據(jù)塊,任何一個文件不管有多小,都是一個獨立的數(shù)據(jù)塊,而這些數(shù)據(jù)塊的信息則是保存在元數(shù)據(jù)中的,在之前的博客HDFS基礎(chǔ)里面介紹過在HDFS集群的namenode中會存儲元數(shù)據(jù)的信息,這里再說一下,元數(shù)據(jù)的信息主要包括以下3部分:
1)抽象目錄樹
2)文件和數(shù)據(jù)塊的映射關(guān)系,一個數(shù)據(jù)塊的元數(shù)據(jù)大小大約是150byte
3)數(shù)據(jù)塊的多個副本存儲地
而元數(shù)據(jù)的存儲在磁盤(1和2)和內(nèi)存中(1、2和3),而服務(wù)器中的內(nèi)存是有上限的,舉個例子:
有100個1M的文件存儲進入HDFS系統(tǒng),那么數(shù)據(jù)塊的個數(shù)就是100個,元數(shù)據(jù)的大小就是100*150byte,消耗了15000byte的內(nèi)存,但是只存儲了100M的數(shù)據(jù)。
有1個100M的文件存儲進入HDFS系統(tǒng),那么數(shù)據(jù)塊的個數(shù)就是1個,元數(shù)據(jù)的大小就是150byte,消耗量150byte的內(nèi)存,存儲量100M的數(shù)據(jù)。
所以說HDFS文件系統(tǒng)不適用于存儲小文件。
HDFS的輔助功能
HDFS作為一個文件系統(tǒng)。有兩個最主要的功能:上傳和下載。而為了保障這兩個功能的完美和高效實現(xiàn),HDFS提供了很多的輔助功能
1.心跳機制
普通話講解
1、 Hadoop 是 Master/Slave 結(jié)構(gòu),Master 中有 NameNode 和 ResourceManager,Slave 中有 Datanode 和 NodeManager?
2、 Master 啟動的時候會啟動一個 IPC(Inter-Process Comunication,進程間通信)server 服 務(wù),等待 slave 的鏈接
3、 Slave 啟動時,會主動鏈接 master 的 ipc server 服務(wù),并且每隔 3 秒鏈接一次 master,這 個間隔時間是可以調(diào)整的,參數(shù)為 dfs.heartbeat.interval,這個每隔一段時間去連接一次 的機制,我們形象的稱為心跳。Slave 通過心跳匯報自己的信息給 master,master 也通 過心跳給 slave 下達命令,
4、 NameNode 通過心跳得知 Datanode 的狀態(tài) ,ResourceManager 通過心跳得知 NodeManager 的狀態(tài)
5、 如果 master 長時間都沒有收到 slave 的心跳,就認為該 slave 掛掉了。!!!!!
大白話講解
1、DataNode啟動的時候會向NameNode匯報信息,就像釘釘上班打卡一樣,你打卡之后,你領(lǐng)導(dǎo)才知道你今天來上班了,同樣的道理,DataNode也需要向NameNode進行匯報,只不過每次匯報的時間間隔有點短而已,默認是3秒中,DataNode向NameNode匯報的信息有2點,一個是自身DataNode的狀態(tài)信息,另一個是自身DataNode所持有的所有的數(shù)據(jù)塊的信息。而DataNode是不會知道他保存的所有的數(shù)據(jù)塊副本到底是屬于哪個文件,這些都是存儲在NameNode的元數(shù)據(jù)中。
2、按照規(guī)定,每個DataNode都是需要向NameNode進行匯報。那么如果從某個時刻開始,某個DataNode再也不向NameNode進行匯報了。 有可能宕機了。因為只要通過網(wǎng)絡(luò)傳輸數(shù)據(jù),就一定存在一種可能: 丟失 或者 延遲。
3、HDFS的標準: NameNode如果連續(xù)10次沒有收到DataNode的匯報。 那么NameNode就會認為該DataNode存在宕機的可能。
4、DataNode啟動好了之后,會專門啟動一個線程,去負責(zé)給NameNode發(fā)送心跳數(shù)據(jù)包,如果說整個DataNode沒有任何問題,但是僅僅只是當(dāng)前負責(zé)發(fā)送信條數(shù)據(jù)包的線程掛了。NameNode會發(fā)送命令向這個DataNode進行確認。查看這個發(fā)送心跳數(shù)據(jù)包的服務(wù)是否還能正常運行,而為了保險起見,NameNode會向DataNode確認2遍,每5分鐘確認一次。如果2次都沒有返回 結(jié)果,那么NameNode就會認為DataNode已經(jīng)GameOver了!!!
最終NameNode判斷一個DataNode死亡的時間計算公式:
timeout = 10 * 心跳間隔時間? + 2 * 檢查一次消耗的時間
?心跳間隔時間:dfs.heartbeat.interval 心跳時間:3s
檢查一次消耗的時間:heartbeat.recheck.interval checktime : 5min
最終結(jié)果默認是630s。
2.安全模式
1、HDFS的啟動和關(guān)閉都是先啟動NameNode,在啟動DataNode,最后在啟動secondarynamenode。
2、決定HDFS集群的啟動時長會有兩個因素:
1)磁盤元數(shù)據(jù)的大小
2)datanode的節(jié)點個數(shù)
?當(dāng)元數(shù)據(jù)很大,或者 節(jié)點個數(shù)很多的時候,那么HDFS的啟動,需要一段很長的時間,那么在還沒有完全啟動的時候HDFS能否對外提供服務(wù)?
在HDFS的啟動命令start-dfs.sh執(zhí)行的時候,HDFS會自動進入安全模式
為了確保用戶的操作是可以高效的執(zhí)行成功的,在HDFS發(fā)現(xiàn)自身不完整的時候,會進入安全模式。保護自己。
?
在正常啟動之后,如果HDFS發(fā)現(xiàn)所有的數(shù)據(jù)都是齊全的,那么HDFS會啟動的退出安全模式
3、對安全模式進行測試
安全模式常用操作命令:
hdfs dfsadmin -safemode leave //強制 NameNode 退出安全模式 hdfs dfsadmin -safemode enter //進入安全模式 hdfs dfsadmin -safemode get //查看安全模式狀態(tài) hdfs dfsadmin -safemode wait //等待,一直到安全模式結(jié)束手工進入安全模式進行測試
1、測試創(chuàng)建文件夾
[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、得出結(jié)論,在安全模式下:
如果一個操作涉及到元數(shù)據(jù)的修改的話。都不能進行操作
如果一個操作僅僅只是查詢。那是被允許的。
所謂的安全模式,僅僅只是保護namenode,而不是保護datanode
3.副本存放策略
第一副本:放置在上傳文件的DataNode上;如果是集群外提交,則隨機挑選一臺磁盤不太慢、CPU不太忙的節(jié)點上;
第二副本:放置在于第一個副本不同的機架的節(jié)點上;
第三副本:與第二個副本相同機架的不同節(jié)點上;
如果還有更多的副本:隨機放在節(jié)點中;
4.負載均衡
負載均衡理想狀態(tài):節(jié)點均衡、機架均衡和磁盤均衡。
Hadoop的HDFS集群非常容易出現(xiàn)機器與機器之間磁盤利用率不平衡的情況,例如:當(dāng)集群內(nèi)新增、刪除節(jié)點,或者某個節(jié)點機器內(nèi)硬盤存儲達到飽和值。當(dāng)數(shù)據(jù)不平衡時,Map任務(wù)可能會分配到?jīng)]有存儲數(shù)據(jù)的機器,這將導(dǎo)致網(wǎng)絡(luò)帶寬的消耗,也無法很好的進行本地計算。
當(dāng)HDFS負載不均衡時,需要對HDFS進行數(shù)據(jù)的負載均衡調(diào)整,即對各節(jié)點機器上數(shù)據(jù)的存儲分布進行調(diào)整。從而,讓數(shù)據(jù)均勻的分布在各個DataNode上,均衡IO性能,防止熱點的發(fā)生。進行數(shù)據(jù)的負載均衡調(diào)整,必須要滿足如下原則:
- 數(shù)據(jù)平衡不能導(dǎo)致數(shù)據(jù)塊減少,數(shù)據(jù)塊備份丟失
- 管理員可以中止數(shù)據(jù)平衡進程
- 每次移動的數(shù)據(jù)量以及占用的網(wǎng)絡(luò)資源,必須是可控的
- 數(shù)據(jù)均衡過程,不能影響namenode的正常工作
負載均衡的原理
數(shù)據(jù)均衡過程的核心是一個數(shù)據(jù)均衡算法,該數(shù)據(jù)均衡算法將不斷迭代數(shù)據(jù)均衡邏輯,直至集群內(nèi)數(shù)據(jù)均衡為止。該數(shù)據(jù)均衡算法每次迭代的邏輯如下:
步驟分析如下:
DataNode分組
在第2步中,HDFS會把當(dāng)前的DataNode節(jié)點,根據(jù)閾值的設(shè)定情況劃分到Over、Above、Below、Under四個組中。在移動數(shù)據(jù)塊的時候,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 數(shù)據(jù)自動平衡腳本使用方法
在Hadoop中,包含一個start-balancer.sh腳本,通過運行這個工具,啟動HDFS數(shù)據(jù)均衡服務(wù)。該工具可以做到熱插拔,即無須重啟計算機和 Hadoop 服務(wù)。HadoopHome/bin目錄下的start?balancer.sh腳本就是該任務(wù)的啟動腳本。啟動命令為:‘HadoopHome/bin目錄下的start?balancer.sh腳本就是該任務(wù)的啟動腳本。啟動命令為:‘Hadoop_home/bin/start-balancer.sh –threshold`
影響B(tài)alancer的幾個參數(shù):
- -threshold
- 默認設(shè)置:10,參數(shù)取值范圍:0-100
- 參數(shù)含義:判斷集群是否平衡的閾值。理論上,該參數(shù)設(shè)置的越小,整個集群就越平衡
- dfs.balance.bandwidthPerSec
- 默認設(shè)置:1048576(1M/S)
- 參數(shù)含義:Balancer運行時允許占用的帶寬
示例如下:
#啟動數(shù)據(jù)均衡,默認閾值為 10% $Hadoop_home/bin/start-balancer.sh#啟動數(shù)據(jù)均衡,閾值 5% bin/start-balancer.sh –threshold 5#停止數(shù)據(jù)均衡 $Hadoop_home/bin/stop-balancer.sh在hdfs-site.xml文件中可以設(shè)置數(shù)據(jù)均衡占用的網(wǎng)絡(luò)帶寬限制
<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>?
轉(zhuǎn)載于:https://www.cnblogs.com/qingyunzong/p/8535995.html
總結(jié)
以上是生活随笔為你收集整理的Hadoop学习之路(九)HDFS深入理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ctsc2009 移民站选址
- 下一篇: 办信用卡需要什么条件?看你要办理什么卡!