背景
由于历史原因,CDH的hadoop的每个DataNode节点下挂载了多个磁盘,后要对一些配置差的磁盘要用配置较好的新磁盘进行替换,这时候就需要撤出旧磁盘,并保证数据不丢失的情况下更换磁盘。在更换磁盘的过程可能会遇到如下情况,有些磁盘的使用量特别大,已经块占满,而有些磁盘的使用量较少,但是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-6