背景

由于历史原因,CDH的hadoop的每个datanode节点有3个数据磁盘,每个磁盘的大小不一样

data 500G

data1 2T

data2 2T

由于阿里云的根目录很小,只有20G,所以MR的中间文件,日志等只能跟数据盘共用。然后,Hadoop在写入数据的时候,会先写满一个磁盘再写其他磁盘,这样某个磁盘满了,就不能在写入日志和中间文件,导致无法进行MR,节点就会变为inactive状态,不可用。虽然可以设置每个磁盘预留空间,但是:第一,每个磁盘大小不一样,而预留空间的大小必须设置成一样,所以这个预留空间的值很难设定。第二,要设置预留空间,必须要保证该磁盘现在有这么多足够的空闲空间,然而由于已经有个别盘已经填满数据,操作变得异常困难。

 

方案

考虑到当前的方案对今后的影响,我们把这个空间最小的data盘从数据盘中移除,专门用做临时文件和日志或者其他目的,不放hdfs的数据。

移除的动作不能直接从集群中移除,因为数据还存放在这些磁盘中。我们知道,hadoop默认是3份副本,移除一块或者两块磁盘,数据是不会丢失的。为了保险起见,我们一块一块操作,移除一块之后,会有若干副本丢失。

 

步骤

1.   停止CDH集群

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