背景
因为历史缘由,CDH的hadoop的每一个DataNode节点下挂载了多个磁盘,后要对一些配置差的磁盘要用配置较好的新磁盘进行替换,这时候就须要撤出旧磁盘,并保证数据不丢失的状况下更换磁盘。node
在更换磁盘的过程可能会遇到以下状况,有些磁盘的使用量特别大,已经块占满,而有些磁盘的使用量较少,可是hdfs在写入数据时默认仍是向使用量比较的磁盘中写入数据,这样就会致使有些磁盘会提早爆满的现象;对于这样的问题,能够从以下两个角度解决问题,第一,在挂载磁盘的时候,给每一个磁盘都设置预留空间;第二,经过修改hdfs使用磁盘的规则,使用hdfs优先使用磁盘空间较大的磁盘。
方案
移除的动做不能直接从集群中移除,由于数据还存放在这些磁盘中。咱们知道,hadoop默认是3份副本,移除一块或者两块磁盘,数据是不会丢失的。为了保险起见,咱们一块一块操做,移除一块以后,会有若干副本丢失。
步骤
1. 中止CDH集群
2. 先从一个节点开始,好比从slave-01上,先将dfs.data.dir, dfs.datanode.data.dir这个配置中,删除/data/dfs/dn, 只保留/data1/dfs/dn和/data2/dfs/dn
3. 重启集群
4. 打开网页http://master-02:50070/fsck, 会开始检查数据副本的状况。最后有一个检查报告,提示block损坏的状况,和副本的丢失状况。由于已经删除一个磁盘,可能会有不少数据只有2个副本。有的临时的jar文件,因为副本数被设置为1,因此会丢失,不过这些是Mapreduce临时生成的文件,不影响数据的完整性。
5. 运行hadoop fs -setrep -w 3 -R /, 从新生成副本, 若是中途出现out of memory,则从新运行该命令便可
6. 查看检查报告看看有哪些目录的数据丢失,是否无关数据,删除这些无关数据:hadoop fsck <目录> -delete
7. 重复步骤2-6oop