最近發現hdfs的一個問題,每當集群開啟的時候,有一個節點上的可用空間就一直在減少,並且速度很快,發現是data目錄下的dncp_block_verification.log.curr文件在一直變大,查了日志沒有發現什么可疑的原因,只在datanode的日志上發現有幾條日志如下非常可疑:
2015-11-28 21:35:51,029 INFO org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetAsyncDiskService: Deleted BP-1219379569-1 92.168.1.50-1445090469366 blk_1073748736_7916 file /home/hadoop/hdfsdisk/data/current/BP-1219379569-192.168.1.50-1445090469366/curren t/finalized/subdir0/subdir27/blk_1073748736 2015-11-28 21:35:51,062 INFO org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetAsyncDiskService: Deleted BP-1219379569-1 92.168.1.50-1445090469366 blk_1073846979_106183 file /home/hadoop/hdfsdisk/data/current/BP-1219379569-192.168.1.50-1445090469366/curr ent/finalized/subdir1/subdir154/blk_1073846979
好像是namenode發出的刪除請求,但是不知道在刪除什么
由於暫時沒有找出故障原因,所以打算將這個節點刪除,然后將節點再添加回來,具體步驟如下:
1. 平滑刪除節點
1.1 修改hdfd-site.xml文件
首先集群是開啟的,然后添加代碼如下:
<property> <name>dfs.hosts.exclude</name> <value>/home/hadoop/hadoop-2.6.0/etc/hadoop/excludes</value> <description> Names a file that contains a list of hosts that are not permitted to connect to the namenode. The full pathnam e of the file must be specified If the value is empty, no hosts are excluded. </description> </property>
其中/home/hadoop/hadoop-2.6.0/etc/hadoop/excludes文件中為要刪除的機器hostname,示例如下:
slave8.spark
slave9.spark
1.2 然后執行命令刷新hdfs節點:
hadoop dfsadmin -refreshNodes
更新hdfs節點狀態,由於存在副本的原因,在后台會有塊的移動
1.3 運行命令查看hdfs報告
hadoop dfsadmin -report
會顯示如下狀態:
Live datanodes (8): Name: 192.168.1.58:50010 (slave8.spark) Hostname: slave8.spark Decommission Status : Decommission in progress Configured Capacity: 898359930880 (836.66 GB) DFS Used: 844093001728 (786.12 GB) Non DFS Used: 47660601344 (44.39 GB) DFS Remaining: 6606327808 (6.15 GB) DFS Used%: 93.96% DFS Remaining%: 0.74% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 1 Last contact: Sun Nov 29 13:41:48 CST 2015
說明該節點已經被移除,其實應該等到在hdfs內部塊移動結束之后再結束集群,但是我沒有等到,直接在顯示如上狀態后就關閉了集群,然后將slaves中的該節點hostname刪除后啟動了集群,啟動后hdfs又開始了移動塊,但是很慢,會等很長時間,但是如果集群一直要用無法關閉集群的話,這個過程是很重要的。
2. 添加節點
添加新節點時需要在slaves配置文件中新增即將添加的節點,然后再進行集群平衡操作,如果不想進行平衡操作也可以(不推薦),這樣做只是導致了集群中每個節點已占用空間大小不一致,添加節點也有兩種方式,平滑添加和非平滑添加,具體操作如下:
2.1 平滑添加,需要停止namenode
1.停止namenode
2.修改slaves文件
3.啟動namenode
4.執行hadoop balance命令平衡集群節點
2.2非平滑添加datanode,不需要停止namenode
1.修改slaves文件,添加需要增加的節點
2.啟動datanode,hadoop-daemon.sh start datanode
3.執行hadoop balance命令平衡集群節點
執行節點平衡命令為balance命令,使用示例如下:start-balancer.sh -threshold 8,具體詳細使用方法請查閱。