1、引言:html
<property> <name>dfs.datanode.du.reserved</name> <value>107374182400</value> </property>
上面這個參數的意思:java
Reserved space in bytes per volume. Always leave this much space free for non dfs use.node
再查看datanode日誌,但願能找到可靠的線索:apache
這種錯誤沒法經過namenode來避免,由於它不會再failed的時候去嘗試往別的節點寫數, 最初的辦法是將該節點的datanode關閉掉,就能順利地跑完這個mapreduce。服務器
再者查看namenode的頁面,看到有好多datanode的節點的Remaining快要趨於0B了,這個時候就很容易出現上面的報錯。網絡
The balancer is a tool that balances disk space usage on an HDFS cluster when some datanodes become full or when new empty nodes join the cluster.
The tool is deployed as an application program that can be run by the cluster administrator on a live HDFS cluster while applications adding and deleting files.app
下面的圖片是官網中balancer命令得詳解:tcp
start-balancer.sh -threshold 20 -policy blockpool -include -f /tmp/ip.txt
<property> <name>dfs.datanode.balance.bandwidthPerSec</name> <value>10485760</value> </property>
可是這個須要重啓,hadoop提供了一個動態調整的命令:oop
hdfs dfsadmin -fs hdfs://ns1:8020 -setBalancerBandwidth 104857600 hdfs dfsadmin -fs hdfs://ns2:8020 -setBalancerBandwidth 104857600 hdfs dfsadmin -fs hdfs://ns3:8020 -setBalancerBandwidth 104857600 hdfs dfsadmin -fs hdfs://ns4:8020 -setBalancerBandwidth 104857600 hdfs dfsadmin -fs hdfs://ns5:8020 -setBalancerBandwidth 104857600
hdfs dfs -get hdfs://ns1/test/dt=2016-07-24/000816_0.lzo hdfs dfs -put -f 000816_0.lzo hdfs://ns1/test/dt=2016-07-24/000816_0.lzo hdfs dfs -chown dd_edw:dd_edw hdfs://ns1/test/dt=2016-07-24/000816_0.lzo
前提條件須要將這個節點的datanode從新啓動。ui
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哥副本。具體的hdfs dfs -setrep命令以下圖:
這樣動態的升降副本能夠解決。
另外在升降副本的遇到一個BUG:
推測多是namenode的replications模塊有夯住狀況,因此出現該狀況執行kill掉進行,跳過該塊再跑!
總結:之因此選擇使用升降副本是由於它不受帶寬的控制,另外在升降副本的時候hadoop是須要從新寫數的,這個時候它會優先往磁盤低寫數據,這樣就能將磁盤高的數據遷移至磁盤低的。
四、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.
在這裏舉一個例子:
經過distcp將/tmp/output12上的數據調用mapreduce遷移至/tmp/zhulh目錄下,原先/tmp/output12上的數據仍是有存在的,可是它的塊就發生了變化。
這個時候有人可能會說怎麼不使用cp命令呢?
二者的區別以下:
CP的模式是不走mapreduce的;DISTCP的模式是走mapreduce的,因此它優先寫有nodemanager的機器;
CP是單線程的,相似scp的模式,在執行速度上比DISTCP要慢不少。
五、提升dfs.datanode.du.reserved值
官網是這麼說的:Reserved space in bytes per volume. Always leave this much space free for non dfs use.
在上面的提到dfs.datanode.du.reserved的值是設成100G,由於namenode認爲該節點還有剩餘的空間,因此給分配到這裏,假如這個塊是128K,可是實際剩餘空間只有100K,因此就會報上面的錯誤,假如把dfs.datanode.du.reserved成300G,讓namenode知道該節點已經沒有剩餘空間,因此就不會往這裏寫數據了。
六、關閉nodemanger進程
在現有計算資源多餘的狀況下,能夠考慮關閉高磁盤節點的nodemanager,避免在該節點起YarnChild,由於若是在該節點上進行計算的話,數據存儲首先會往本地寫一份,這樣更加加劇了本地節點的負擔。
七、刪除舊數據
該方案是在無可奈何的狀況下進行的,由於刪掉的數據可能之後還得補回來,這樣的話又是得要浪費必定的時間。
另外在刪除數據時候就得須要跳過回收站才能算是真正刪除,可使用的命令以下:
本篇文章主要介紹了對hadoop數據出現不均衡狀況下可使用的方案,並以實例來解決問題!
對此有興趣的同窗歡迎一塊兒交流 。