手动处理datanode磁盘间使用不均的问题

http://wiki.apache.org/hadoop/FAQ#On_an_individual_data_node.2C_how_do_you_balance_the_blocks_on_the_disk.3F

关于这个问题,Hadoop暂时未提供自动解决的方案,已经提上日程,jira上有记录。

hadoop wiki上提到了手动处理的解决方案。如上链接如示。

问题描述,一个datanode节点的datanode.dir会配置多个磁盘或目录,而如果因某些原因,如坏盘更换或磁盘选择策略的问题,

造成某一些磁盘目录使用很多,而某些或某个盘的使用率很低,这个时候可以手动进行处理。

1。先把这个datanode节点的datanode进程停掉,这样就不写入数据,才可以进行下一步操作。

2。例如从/data1/ 把block move到/data2/ 则尽可能保证目录结构一致,wiki中提到新版本中子目录不一致也不行。

mv的时候,要注意权限,不要使用root用户mv完之后,不改权限,这也会造成无法读取的问题。

我自己测试的环境cdh5.0.2 hadoop2.3

data.dir /hdp2/dfs/data ,新添加一个路径,/hdp2/dfs/data2

因为data2目录是空的,如果启动datanode 会对该目录进行初始化,如创建 version文件等。

我直接在data2中创建了数据池等目录到finalized ,然后把data下面第一层的block和meta挪了过来,没有把subdir目录挪过来。

我直接启动了datanode进程后,发现我挪过来的数据被删除了(为什么)

不过还好,副制因子是2,这些数据会同步过来。我停掉datanode进程,把subdir10(这里面有数据)直接mv到/data2相应的目录下,

再次启动datanode进程,webui上检查发现,block是被发现了。

为安全起见,在生产环境中操作,一定要对数据进行一下备份,或者是先上传一个大文件,然后针对这个文件的blocks进行测试后再大规模处理。

上一篇:Delphi面向对象---接口


下一篇:Delphi 的接口机制——接口操作的编译器实现过程(1)