|
目錄 正文 HDFS的優(yōu)點(diǎn)和缺點(diǎn)
HDFS的優(yōu)點(diǎn)
1、可構(gòu)建在廉價(jià)機(jī)器上
通過多副本提高可靠性,提供了容錯(cuò)和恢復(fù)機(jī)制
服務(wù)器節(jié)點(diǎn)的宕機(jī)是常態(tài) 必須理性對(duì)象
2、高容錯(cuò)性
數(shù)據(jù)自動(dòng)保存多個(gè)副本,副本丟失后,自動(dòng)恢復(fù)
HDFS的核心設(shè)計(jì)思想: 分散均勻存儲(chǔ) + 備份冗余存儲(chǔ)
3、適合批處理
移動(dòng)計(jì)算而非數(shù)據(jù),數(shù)據(jù)位置暴露給計(jì)算框架
海量數(shù)據(jù)的計(jì)算 任務(wù) 最終是一定要被切分成很多的小任務(wù)進(jìn)行
4、適合大數(shù)據(jù)處理
GB、TB、甚至 PB 級(jí)數(shù)據(jù),百萬規(guī)模以上的文件數(shù)量,10K+節(jié)點(diǎn)規(guī)模
5、流式文件訪問
一次性寫入,多次讀取,保證數(shù)據(jù)一致性
HDFS的缺點(diǎn)
不適合以下操作
1、低延遲數(shù)據(jù)訪問
比如毫秒級(jí) 低延遲與高吞吐率
2、小文件存取
占用 NameNode 大量?jī)?nèi)存 150b* 1000W = 15E,1.5G 尋道時(shí)間超過讀取時(shí)間
3、并發(fā)寫入、文件隨機(jī)修改
一個(gè)文件只能有一個(gè)寫者 僅支持 append
拋出問題:HDFS文件系統(tǒng)為什么不適用于存儲(chǔ)小文件?
這是和HDFS系統(tǒng)底層設(shè)計(jì)實(shí)現(xiàn)有關(guān)系的,HDFS本身的設(shè)計(jì)就是用來解決海量大文件數(shù)據(jù)的存儲(chǔ).,他天生喜歡大數(shù)據(jù)的處理,大文件存儲(chǔ)在HDFS中,會(huì)被切分成很多的小數(shù)據(jù)塊,任何一個(gè)文件不管有多小,都是一個(gè)獨(dú)立的數(shù)據(jù)塊,而這些數(shù)據(jù)塊的信息則是保存在元數(shù)據(jù)中的,在之前的博客HDFS基礎(chǔ)里面介紹過在HDFS集群的namenode中會(huì)存儲(chǔ)元數(shù)據(jù)的信息,這里再說一下,元數(shù)據(jù)的信息主要包括以下3部分:
1)抽象目錄樹
2)文件和數(shù)據(jù)塊的映射關(guān)系,一個(gè)數(shù)據(jù)塊的元數(shù)據(jù)大小大約是150byte
3)數(shù)據(jù)塊的多個(gè)副本存儲(chǔ)地
而元數(shù)據(jù)的存儲(chǔ)在磁盤(1和2)和內(nèi)存中(1、2和3),而服務(wù)器中的內(nèi)存是有上限的,舉個(gè)例子:
有100個(gè)1M的文件存儲(chǔ)進(jìn)入HDFS系統(tǒng),那么數(shù)據(jù)塊的個(gè)數(shù)就是100個(gè),元數(shù)據(jù)的大小就是100*150byte,消耗了15000byte的內(nèi)存,但是只存儲(chǔ)了100M的數(shù)據(jù)。
有1個(gè)100M的文件存儲(chǔ)進(jìn)入HDFS系統(tǒng),那么數(shù)據(jù)塊的個(gè)數(shù)就是1個(gè),元數(shù)據(jù)的大小就是150byte,消耗量150byte的內(nèi)存,存儲(chǔ)量100M的數(shù)據(jù)。
所以說HDFS文件系統(tǒng)不適用于存儲(chǔ)小文件。
HDFS的輔助功能
HDFS作為一個(gè)文件系統(tǒng)。有兩個(gè)最主要的功能:上傳和下載。而為了保障這兩個(gè)功能的完美和高效實(shí)現(xiàn),HDFS提供了很多的輔助功能
1.心跳機(jī)制
普通話講解
1、 Hadoop 是 Master/Slave 結(jié)構(gòu),Master 中有 NameNode 和 ResourceManager,Slave 中有 Datanode 和 NodeManager
2、 Master 啟動(dòng)的時(shí)候會(huì)啟動(dòng)一個(gè) IPC(Inter-Process Comunication,進(jìn)程間通信)server 服 務(wù),等待 slave 的鏈接
3、 Slave 啟動(dòng)時(shí),會(huì)主動(dòng)鏈接 master 的 ipc server 服務(wù),并且每隔 3 秒鏈接一次 master,這 個(gè)間隔時(shí)間是可以調(diào)整的,參數(shù)為 dfs.heartbeat.interval,這個(gè)每隔一段時(shí)間去連接一次 的機(jī)制,我們形象的稱為心跳。Slave 通過心跳匯報(bào)自己的信息給 master,master 也通 過心跳給 slave 下達(dá)命令,
4、 NameNode 通過心跳得知 Datanode 的狀態(tài) ,ResourceManager 通過心跳得知 NodeManager 的狀態(tài)
5、 如果 master 長(zhǎng)時(shí)間都沒有收到 slave 的心跳,就認(rèn)為該 slave 掛掉了。!?。。?!
大白話講解
1、DataNode啟動(dòng)的時(shí)候會(huì)向NameNode匯報(bào)信息,就像釘釘上班打卡一樣,你打卡之后,你領(lǐng)導(dǎo)才知道你今天來上班了,同樣的道理,DataNode也需要向NameNode進(jìn)行匯報(bào),只不過每次匯報(bào)的時(shí)間間隔有點(diǎn)短而已,默認(rèn)是3秒中,DataNode向NameNode匯報(bào)的信息有2點(diǎn),一個(gè)是自身DataNode的狀態(tài)信息,另一個(gè)是自身DataNode所持有的所有的數(shù)據(jù)塊的信息。而DataNode是不會(huì)知道他保存的所有的數(shù)據(jù)塊副本到底是屬于哪個(gè)文件,這些都是存儲(chǔ)在NameNode的元數(shù)據(jù)中。
2、按照規(guī)定,每個(gè)DataNode都是需要向NameNode進(jìn)行匯報(bào)。那么如果從某個(gè)時(shí)刻開始,某個(gè)DataNode再也不向NameNode進(jìn)行匯報(bào)了。 有可能宕機(jī)了。因?yàn)橹灰ㄟ^網(wǎng)絡(luò)傳輸數(shù)據(jù),就一定存在一種可能: 丟失 或者 延遲。
3、HDFS的標(biāo)準(zhǔn): NameNode如果連續(xù)10次沒有收到DataNode的匯報(bào)。 那么NameNode就會(huì)認(rèn)為該DataNode存在宕機(jī)的可能。
4、DataNode啟動(dòng)好了之后,會(huì)專門啟動(dòng)一個(gè)線程,去負(fù)責(zé)給NameNode發(fā)送心跳數(shù)據(jù)包,如果說整個(gè)DataNode沒有任何問題,但是僅僅只是當(dāng)前負(fù)責(zé)發(fā)送信條數(shù)據(jù)包的線程掛了。NameNode會(huì)發(fā)送命令向這個(gè)DataNode進(jìn)行確認(rèn)。查看這個(gè)發(fā)送心跳數(shù)據(jù)包的服務(wù)是否還能正常運(yùn)行,而為了保險(xiǎn)起見,NameNode會(huì)向DataNode確認(rèn)2遍,每5分鐘確認(rèn)一次。如果2次都沒有返回 結(jié)果,那么NameNode就會(huì)認(rèn)為DataNode已經(jīng)GameOver了?。?!
最終NameNode判斷一個(gè)DataNode死亡的時(shí)間計(jì)算公式:
timeout = 10 * 心跳間隔時(shí)間 + 2 * 檢查一次消耗的時(shí)間
心跳間隔時(shí)間:dfs.heartbeat.interval 心跳時(shí)間:3s 檢查一次消耗的時(shí)間:heartbeat.recheck.interval checktime : 5min
最終結(jié)果默認(rèn)是630s。

2.安全模式
1、HDFS的啟動(dòng)和關(guān)閉都是先啟動(dòng)NameNode,在啟動(dòng)DataNode,最后在啟動(dòng)secondarynamenode。

2、決定HDFS集群的啟動(dòng)時(shí)長(zhǎng)會(huì)有兩個(gè)因素:
1)磁盤元數(shù)據(jù)的大小
2)datanode的節(jié)點(diǎn)個(gè)數(shù)
當(dāng)元數(shù)據(jù)很大,或者 節(jié)點(diǎn)個(gè)數(shù)很多的時(shí)候,那么HDFS的啟動(dòng),需要一段很長(zhǎng)的時(shí)間,那么在還沒有完全啟動(dòng)的時(shí)候HDFS能否對(duì)外提供服務(wù)?
在HDFS的啟動(dòng)命令start-dfs.sh執(zhí)行的時(shí)候,HDFS會(huì)自動(dòng)進(jìn)入安全模式
為了確保用戶的操作是可以高效的執(zhí)行成功的,在HDFS發(fā)現(xiàn)自身不完整的時(shí)候,會(huì)進(jìn)入安全模式。保護(hù)自己。

在正常啟動(dòng)之后,如果HDFS發(fā)現(xiàn)所有的數(shù)據(jù)都是齊全的,那么HDFS會(huì)啟動(dòng)的退出安全模式

3、對(duì)安全模式進(jìn)行測(cè)試
安全模式常用操作命令:
hdfs dfsadmin -safemode leave //強(qiáng)制 NameNode 退出安全模式
hdfs dfsadmin -safemode enter //進(jìn)入安全模式
hdfs dfsadmin -safemode get //查看安全模式狀態(tài)
hdfs dfsadmin -safemode wait //等待,一直到安全模式結(jié)束
手工進(jìn)入安全模式進(jìn)行測(cè)試
1、測(cè)試創(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、測(cè)試下載文件
[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、測(cè)試上傳
[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é)論,在安全模式下:
如果一個(gè)操作涉及到元數(shù)據(jù)的修改的話。都不能進(jìn)行操作
如果一個(gè)操作僅僅只是查詢。那是被允許的。
所謂的安全模式,僅僅只是保護(hù)namenode,而不是保護(hù)datanode
3.副本存放策略
第一副本:放置在上傳文件的DataNode上;如果是集群外提交,則隨機(jī)挑選一臺(tái)磁盤不太慢、CPU不太忙的節(jié)點(diǎn)上; 第二副本:放置在于第一個(gè)副本不同的機(jī)架的節(jié)點(diǎn)上; 第三副本:與第二個(gè)副本相同機(jī)架的不同節(jié)點(diǎn)上; 如果還有更多的副本:隨機(jī)放在節(jié)點(diǎn)中;

4.負(fù)載均衡
負(fù)載均衡理想狀態(tài):節(jié)點(diǎn)均衡、機(jī)架均衡和磁盤均衡。
Hadoop的HDFS集群非常容易出現(xiàn)機(jī)器與機(jī)器之間磁盤利用率不平衡的情況,例如:當(dāng)集群內(nèi)新增、刪除節(jié)點(diǎn),或者某個(gè)節(jié)點(diǎn)機(jī)器內(nèi)硬盤存儲(chǔ)達(dá)到飽和值。當(dāng)數(shù)據(jù)不平衡時(shí),Map任務(wù)可能會(huì)分配到?jīng)]有存儲(chǔ)數(shù)據(jù)的機(jī)器,這將導(dǎo)致網(wǎng)絡(luò)帶寬的消耗,也無法很好的進(jìn)行本地計(jì)算。 當(dāng)HDFS負(fù)載不均衡時(shí),需要對(duì)HDFS進(jìn)行數(shù)據(jù)的負(fù)載均衡調(diào)整,即對(duì)各節(jié)點(diǎn)機(jī)器上數(shù)據(jù)的存儲(chǔ)分布進(jìn)行調(diào)整。從而,讓數(shù)據(jù)均勻的分布在各個(gè)DataNode上,均衡IO性能,防止熱點(diǎn)的發(fā)生。進(jìn)行數(shù)據(jù)的負(fù)載均衡調(diào)整,必須要滿足如下原則:
- 數(shù)據(jù)平衡不能導(dǎo)致數(shù)據(jù)塊減少,數(shù)據(jù)塊備份丟失
- 管理員可以中止數(shù)據(jù)平衡進(jìn)程
- 每次移動(dòng)的數(shù)據(jù)量以及占用的網(wǎng)絡(luò)資源,必須是可控的
- 數(shù)據(jù)均衡過程,不能影響namenode的正常工作
負(fù)載均衡的原理
數(shù)據(jù)均衡過程的核心是一個(gè)數(shù)據(jù)均衡算法,該數(shù)據(jù)均衡算法將不斷迭代數(shù)據(jù)均衡邏輯,直至集群內(nèi)數(shù)據(jù)均衡為止。該數(shù)據(jù)均衡算法每次迭代的邏輯如下:

步驟分析如下:
- 數(shù)據(jù)均衡服務(wù)(Rebalancing Server)首先要求 NameNode 生成 DataNode 數(shù)據(jù)分布分析報(bào)告,獲取每個(gè)DataNode磁盤使用情況
- Rebalancing Server匯總需要移動(dòng)的數(shù)據(jù)分布情況,計(jì)算具體數(shù)據(jù)塊遷移路線圖。數(shù)據(jù)塊遷移路線圖,確保網(wǎng)絡(luò)內(nèi)最短路徑
- 開始數(shù)據(jù)塊遷移任務(wù),Proxy Source Data Node復(fù)制一塊需要移動(dòng)數(shù)據(jù)塊
- 將復(fù)制的數(shù)據(jù)塊復(fù)制到目標(biāo)DataNode上
- 刪除原始數(shù)據(jù)塊
- 目標(biāo)DataNode向Proxy Source Data Node確認(rèn)該數(shù)據(jù)塊遷移完成
- Proxy Source Data Node向Rebalancing Server確認(rèn)本次數(shù)據(jù)塊遷移完成。然后繼續(xù)執(zhí)行這個(gè)過程,直至集群達(dá)到數(shù)據(jù)均衡標(biāo)準(zhǔn)
DataNode分組
在第2步中,HDFS會(huì)把當(dāng)前的DataNode節(jié)點(diǎn),根據(jù)閾值的設(shè)定情況劃分到Over、Above、Below、Under四個(gè)組中。在移動(dòng)數(shù)據(jù)塊的時(shí)候,Over組、Above組中的塊向Below組、Under組移動(dòng)。四個(gè)組定義如下:

DataNode_usedSpace_percent > Cluster_usedSpace_percent + threshold
Cluster_usedSpace_percent + threshold > DataNode_ usedSpace _percent >Cluster_usedSpace_percent
Cluster_usedSpace_percent > DataNode_ usedSpace_percent > Cluster_ usedSpace_percent – threshold
Cluster_usedSpace_percent – threshold > DataNode_usedSpace_percent
Hadoop HDFS 數(shù)據(jù)自動(dòng)平衡腳本使用方法
在Hadoop中,包含一個(gè)start-balancer.sh腳本,通過運(yùn)行這個(gè)工具,啟動(dòng)HDFS數(shù)據(jù)均衡服務(wù)。該工具可以做到熱插拔,即無須重啟計(jì)算機(jī)和 Hadoop 服務(wù)。HadoopHome/bin目錄下的start?balancer.sh腳本就是該任務(wù)的啟動(dòng)腳本。啟動(dòng)命令為:‘HadoopHome/bin目錄下的start?balancer.sh腳本就是該任務(wù)的啟動(dòng)腳本。啟動(dòng)命令為:‘Hadoop_home/bin/start-balancer.sh –threshold`
影響B(tài)alancer的幾個(gè)參數(shù):
- -threshold
- 默認(rèn)設(shè)置:10,參數(shù)取值范圍:0-100
- 參數(shù)含義:判斷集群是否平衡的閾值。理論上,該參數(shù)設(shè)置的越小,整個(gè)集群就越平衡
- dfs.balance.bandwidthPerSec
- 默認(rèn)設(shè)置:1048576(1M/S)
- 參數(shù)含義:Balancer運(yùn)行時(shí)允許占用的帶寬
示例如下:
#啟動(dòng)數(shù)據(jù)均衡,默認(rèn)閾值為 10%
$Hadoop_home/bin/start-balancer.sh
#啟動(dòng)數(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>
|