1. 程式人生 > >HDFS叢集磁碟傾斜不均衡的解決方案

HDFS叢集磁碟傾斜不均衡的解決方案

一、引起磁碟傾斜不均衡的可能原因有哪些 (1)擴容節點,向叢集中新增新的資料節點 (2)資料節點之間的磁碟大小不一致

二、磁碟傾斜引起的效能問題 (1)MR程式無法很好地利用本地計算的優勢 (2)機器之間無法達到更好的網路頻寬使用率 (3)機器磁碟無法利用

三、解決磁碟傾斜的方案 (1)使用資料均衡工具手動balance 如果是cm,選擇“重新平衡”; 如果是手動的hadoop叢集,使用命令: start-balancer.sh -threshold 20 -policy blockpool -include -f /tmp/ip.txt 上面的命令通過手工篩選出磁碟高的和磁碟低的放在ip.txt檔案中,這樣balance就只通過這檔案裡的了,另外還需要設定適當的threshold值,因為是多namespace的,所以需要選擇blockpool模式。 另外頻寬也是限制balance的一個因素,在hdfs-site.xml中是有設定的:

<property>  
    <name>dfs.datanode.balance.bandwidthPerSec</name>   
    <value>10485760</value>   
</property>

但是這個需要重啟,hadoop提供了一個動態調整的命令: hdfs dfsadmin -fs hdfs://ns1:8020 -setBalancerBandwidth 104857600 hdfs dfsadmin -fs hdfs://ns2:8020 -setBalancerBandwidth 104857600

(2)上下節點 其實將高磁碟的節點強制Decommission是最快最有效的方案。 下節點的時候可能會出現有ns不能正常下掉的情況,其實這個時候節點的資料大部分已經移出去了,可能有一些塊卡在那邊沒有移出去。 這個時候只能一個一個節點將已經Decommissioned節點stop掉datanode程序,如果在namenode的頁面上看到有丟失塊的話,就需要將這個塊先get到本地,在put上去。例如: hdfs dfs -get hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo hdfs dfs -put -f 000816_0.lzo hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo hdfs dfs -chown test1:test1 hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo 前提條件需要將這個節點的datanode重新啟動。

(3)升降資料副本 升降副本是一個迫不得已的辦法,這樣如果datanode有掛掉節點,就會增加丟失塊的機率。 具體降副本的命令如下: hdfs dfs -setrep -R -w 2 hdfs://ns1/tmp/test.db 升副本的命令如下: hdfs dfs -setrep -R -w 3 hdfs://ns1/tmp/test.db 上面的命令是將ns1下的/tmp/test.db副本數降至2個,然後又將它升至3個副本。這樣動態的升降副本可以解決。 另外在升降副本的遇到一個BUG,過程中可能會出現夯住的情況,推測可能是namenode的replications模組有夯住情況,所以出現該情況執行kill掉進行,跳過該塊再跑。 總結:之所以選擇使用升降副本是因為它不受頻寬的控制,另外在升降副本的時候hadoop是需要重新寫數的,這個時候它會優先往磁碟低寫資料,這樣就能將磁碟高的資料遷移至磁碟低的。

(4)提高dfs.datanode.du.reserved值 官方解釋為:適用於非分散式檔案系統 (DFS) 使用的保留空間(位元組/卷)。 通俗的意思:預留磁碟的一部分空間給作業系統用,這個引數主要是為了防止磁碟空間被寫滿導致的HDFS異常。通常系統預設保留5%的磁碟空間給作業系統用。 所以,當主機的dfs.datanode.du.reserved值高於目前磁碟使用的情況,namenode就不會分配資料過來了

(5)關閉nodemanger程序 在現有計算資源多餘的情況下,可以考慮關閉高磁碟節點的nodemanager,避免在該節點起YarnChild,因為如果在該節點上進行計算的話,資料儲存首先會往本地寫一份,這樣更加加重了本地節點的負擔。

(6)distcp方式(我沒太明白為什麼要用這個方式) distcp與cp兩者的區別如下: CP的模式是不走mapreduce的;DISTCP的模式是走mapreduce的,所以它優先寫有nodemanager的機器; CP是單執行緒的,類似scp的模式,在執行速度上比DISTCP要慢很多。

(7)刪除舊資料(我感覺是刪除磁碟下的資料,而不是dfs資料) 該方案是在迫不得已的情況下進行的,因為刪掉的資料可能以後還得補回來,這樣的話又是得要浪費一定的時間。 另外在刪除資料時候就得需要跳過回收站才能算是真正刪除,可以使用的命令如下: Hadoop dfs -rmr -skipTrash /tmp/output

四、應用場景 (1)在非機器磁碟故障的情況下,例如200節點的叢集,有3或者4臺dn節點出現磁碟爆滿情況,常見的解決方案有: 因為爆滿的主機數較少,可以採用上下節點方式解決

(2)考慮到有多達600臺機器磁碟使用率達到94%,而且這部分高的機器是在同一個機房的,所以不能採用上下節點的方法,最好的辦法如下: 1、提高dfs.datanode.du.reserved的值; 2、關閉nodemanager程序; 3、升降副本; 4、啟動hadoop自帶的balance;