Hadoop集群不均衡的解决方案

  hdfs dfs -get hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo hdfs dfs -put -f 000816_0.lzo hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo hdfs dfs -chown test1:test1 hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo

  前提条件需要将这个节点的datanode重新启动。

  3、升降数据副本:

  升降副本是一个迫不得已的办法,这样如果datanode有挂掉节点,就会增加丢失块的几率。

  具体降副本的命令如下:

  hdfs dfs -setrep -R -w 2 hdfs://ns1/tmp/test.db

  升副本的命令如下:

  hdfs dfs -setrep -R -w 3 hdfs://ns1/tmp/test.db

  上面的命令是将ns1下的/tmp/test.db副本数降至2个,然后又将它升至3个副本。具体的hdfs dfs -setrep命令如下图:

  这样动态的升降副本可以解决。

  另外在升降副本的遇到一个BUG:

物联网

  推测可能是namenode的replications模块有夯住情况,所以出现该情况执行kill掉进行,跳过该块再跑!

  总结:之所以选择使用升降副本是因为它不受带宽的控制,另外在升降副本的时候hadoop是需要重新写数的,这个时候它会优先往磁盘低写数据,这样就能将磁盘高的数据迁移至磁盘低的。

  4、distcp

  DistCp (distributed copy) is a tool used for large inter/intra-cluster copying. It uses MapReduce to effect its distribution, error handling and recovery, and reporting. It expands a list of files and directories into input to map tasks, each of which will copy a partition of the files specified in the source list. Its MapReduce pedigree has endowed it with some quirks in both its semantics and execution. The purpose of this document is to offer guidance for common tasks and to elucidate its model.

  在这里举一个例子:

  通过distcp将/tmp/output12上的数据调用mapreduce迁移至/tmp/zhulh目录下,原先/tmp/output12上的数据还是有存在的,但是它的块就发生了变化。

  这个时候有人可能会说怎么不使用cp命令呢?

  两者的区别如下:

  CP的模式是不走mapreduce的;DISTCP的模式是走mapreduce的,所以它优先写有nodemanager的机器;

  CP是单线程的,类似scp的模式,在执行速度上比DISTCP要慢很多。

  5、提高dfs.datanode.du.reserved值

  官网是这么说的:Reserved space in bytes per volume. Always leave this much space free for non dfs use.

  在上面的提到dfs.datanode.du.reserved的值是设成100G,因为namenode认为该节点还有剩余的空间,所以给分配到这里,假如这个块是128K,但是实际剩余空间只有100K,所以就会报上面的错误,假如把dfs.datanode.du.reserved成300G,让namenode知道该节点已经没有剩余空间,所以就不会往这里写数据了。

  6、关闭nodemanger进程

  在现有计算资源多余的情况下,可以考虑关闭高磁盘节点的nodemanager,避免在该节点起YarnChild,因为如果在该节点上进行计算的话,数据存储首先会往本地写一份,这样更加加重了本地节点的负担。

  7、删除旧数据

  该方案是在迫不得已的情况下进行的,因为删掉的数据可能以后还得补回来,这样的话又是得要浪费一定的时间。

  另外在删除数据时候就得需要跳过回收站才能算是真正删除,可以使用的命令如下:

物联网

  三、方案选择

  考虑到有多达600台机器磁盘使用率达到94%,而且这部分高的机器是在同一个机房的,所以不能采用上下节点的方法,最好的办法如下:

  1、提高dfs.datanode.du.reserved的值;

  2、关闭nodemanager进程;

  3、升降副本;

  4、启动hadoop自带的balance;

  人工的定期观察,当达到期望的效果的时候就是恢复成原样;在提高dfs.datanode.du.reserved的值就得需要考虑到datanode需要进行轮询的重启,这个时候就考虑到时间间隔,如果时间过短就可能就丢,如果过长就是费的时间比较多。