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
前提條件需要將這個(gè)節(jié)點(diǎn)的datanode重新啟動(dòng)。
3、升降數(shù)據(jù)副本:
升降副本是一個(gè)迫不得已的辦法,這樣如果datanode有掛掉節(jié)點(diǎn),就會(huì)增加丟失塊的幾率。
具體降副本的命令如下:
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副本數(shù)降至2個(gè),然后又將它升至3個(gè)副本。具體的hdfs dfs -setrep命令如下圖:

這樣動(dòng)態(tài)的升降副本可以解決。
另外在升降副本的遇到一個(gè)BUG:

推測(cè)可能是namenode的replications模塊有夯住情況,所以出現(xiàn)該情況執(zhí)行kill掉進(jìn)行,跳過(guò)該塊再跑!
總結(jié):之所以選擇使用升降副本是因?yàn)樗皇軒挼目刂?,另外在升降副本的時(shí)候hadoop是需要重新寫(xiě)數(shù)的,這個(gè)時(shí)候它會(huì)優(yōu)先往磁盤低寫(xiě)數(shù)據(jù),這樣就能將磁盤高的數(shù)據(jù)遷移至磁盤低的。
4、distcp
DistCp (distributed copy) is a tool used for large inter/intra-cluster copying. It uses MapReduce to effect its distribution, error handling and recovery, and reporting. It expands a list of files and directories into input to map tasks, each of which will copy a partition of the files specified in the source list. Its MapReduce pedigree has endowed it with some quirks in both its semantics and execution. The purpose of this document is to offer guidance for common tasks and to elucidate its model.
在這里舉一個(gè)例子:


通過(guò)distcp將/tmp/output12上的數(shù)據(jù)調(diào)用mapreduce遷移至/tmp/zhulh目錄下,原先/tmp/output12上的數(shù)據(jù)還是有存在的,但是它的塊就發(fā)生了變化。
這個(gè)時(shí)候有人可能會(huì)說(shuō)怎么不使用cp命令呢?
兩者的區(qū)別如下:
CP的模式是不走mapreduce的;DISTCP的模式是走mapreduce的,所以它優(yōu)先寫(xiě)有nodemanager的機(jī)器;
CP是單線程的,類似scp的模式,在執(zhí)行速度上比DISTCP要慢很多。
5、提高dfs.datanode.du.reserved值
官網(wǎng)是這么說(shuō)的:Reserved space in bytes per volume. Always leave this much space free for non dfs use.
在上面的提到dfs.datanode.du.reserved的值是設(shè)成100G,因?yàn)閚amenode認(rèn)為該節(jié)點(diǎn)還有剩余的空間,所以給分配到這里,假如這個(gè)塊是128K,但是實(shí)際剩余空間只有100K,所以就會(huì)報(bào)上面的錯(cuò)誤,假如把dfs.datanode.du.reserved成300G,讓namenode知道該節(jié)點(diǎn)已經(jīng)沒(méi)有剩余空間,所以就不會(huì)往這里寫(xiě)數(shù)據(jù)了。
6、關(guān)閉nodemanger進(jìn)程
在現(xiàn)有計(jì)算資源多余的情況下,可以考慮關(guān)閉高磁盤節(jié)點(diǎn)的nodemanager,避免在該節(jié)點(diǎn)起YarnChild,因?yàn)槿绻谠摴?jié)點(diǎn)上進(jìn)行計(jì)算的話,數(shù)據(jù)存儲(chǔ)首先會(huì)往本地寫(xiě)一份,這樣更加加重了本地節(jié)點(diǎn)的負(fù)擔(dān)。
7、刪除舊數(shù)據(jù)
該方案是在迫不得已的情況下進(jìn)行的,因?yàn)閯h掉的數(shù)據(jù)可能以后還得補(bǔ)回來(lái),這樣的話又是得要浪費(fèi)一定的時(shí)間。
另外在刪除數(shù)據(jù)時(shí)候就得需要跳過(guò)回收站才能算是真正刪除,可以使用的命令如下:

三、方案選擇
考慮到有多達(dá)600臺(tái)機(jī)器磁盤使用率達(dá)到94%,而且這部分高的機(jī)器是在同一個(gè)機(jī)房的,所以不能采用上下節(jié)點(diǎn)的方法,最好的辦法如下:
1、提高dfs.datanode.du.reserved的值;
2、關(guān)閉nodemanager進(jìn)程;
3、升降副本;
4、啟動(dòng)hadoop自帶的balance;
人工的定期觀察,當(dāng)達(dá)到期望的效果的時(shí)候就是恢復(fù)成原樣;在提高dfs.datanode.du.reserved的值就得需要考慮到datanode需要進(jìn)行輪詢的重啟,這個(gè)時(shí)候就考慮到時(shí)間間隔,如果時(shí)間過(guò)短就可能就丟,如果過(guò)長(zhǎng)就是費(fèi)的時(shí)間比較多。