Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,当hdfs出现不平衡状况的时候,将引发很多问题。

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第1张

一、导言:

Hadoop的HDFS集群十分简单呈现机器与机器之间磁盘运用率不平衡的状况,比方集群中添加新的数据节点,节点与节点之间磁盘巨细不一样等等。当hdfs呈现不平衡状况的时分,将引发许多问题,比方MR程序无法很好地运用本地核算的优势,机器之间无法到达更好的网络带宽运用率,机器磁盘无法运用等等。

二、问题:

因事务需求建立一个新Hadoop集群,并将老的hadoop集群中的数据迁移至新的hadoop集群,并且datanode节点不能悉数上线,其间还或许会呈现节点上线或下线的状况,这个时分就很简单呈现机器与机器之间磁盘的均衡的状况,详细如下:

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第2张

上图中能够看出max是94.18%,而min是0.37%,其间有600多台是到达94%的,这个时分在跑mapred的时分往往会报过错:

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第3张

登陆到该机器上检查服务器的磁盘,磁盘都快现已到达100%,如下:

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第4张

由于咱们在hdfs-site.xml中设置了dfs.datanode.du.reserved的值,所以磁盘会有必定预留空间:

  1. <property>
  2. <name>dfs.datanode.du.reserved</name>
  3. <value>107374182400</value>
  4. </property>

上面这个参数的意思:

Reserved space in bytes per volume. Always leave this much space free for non dfs use.

再检查datanode日志,希望能找到牢靠的头绪:

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第5张

这种过错无法经过namenode来防止,由于它不会再failed的时分去测验往其他节点写数, 开始的办法是将该节点的datanode关闭掉,就能顺畅地跑完这个mapreduce。

再者检查namenode的页面,看到有许多datanode的节点的Remaining快要趋于0B了,这个时分就很简单呈现上面的报错。

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第6张

为了防止上面的报错再次呈现以及防止hdfs数据不均衡,对hadoop集群做balance现已不行防止了!

二、处理计划

1、balancer

咱们首要会想到hadoop自带的balancer,那就先介绍一下balancer!

Balancer.java中是这么描绘balancer的:

The balancer is a tool that balances disk space usage on an HDFS cluster when some datanodes become full or when new empty nodes join the cluster.

The tool is deployed as an application program that can be run by the cluster administrator on a live HDFS cluster while applications adding and deleting files.

下面的图片是官网中balancer指令得详解:

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第7张

考虑到balancer是最近需求常常做的操作,所以咱们自己开发了一个检查balancer状况的页面,成果如下:

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第8张

上图能够看到每个集群下balancer履行状况。

balance一天能成功移动的数据量大约在10-20T,这个数据量很难满意超大集群。

现在咱们调用balance会运用如下指令:

  1. start-balancer.sh-threshold20-policyblockpool-include-f/tmp/ip.txt

上面的指令经过手艺筛选出磁盘高的和磁盘低的放在ip.txt文件中,这样balance就只经过这文件里的了,别的还需求设置恰当的threshold值,由于是多namespace的,所以需求挑选blockpool形式。

别的带宽也是约束balance的一个要素,在hdfs-site.xml中是有设置的:

  1. <property>
  2. <name>dfs.datanode.balance.bandwidthPerSec</name>
  3. <value>10485760</value>
  4. </property>

可是这个需求重启,hadoop供给了一个动态调整的指令:

  1. hdfsdfsadmin-fshdfs://ns1:8020-setBalancerBandwidth104857600
  2. hdfsdfsadmin-fshdfs://ns2:8020-setBalancerBandwidth104857600

2、上下节点:

其实将高磁盘的节点强制Decommission是最快最有用的计划。

下节点的时分或许会呈现有ns不能正常下掉的状况,其实这个时分节点的数据大部分现已移出去了,或许有一些块卡在那儿没有移出去。

这个时分只能一个一个节点将现已Decommissioned节点stop掉datanode进程,假设在namenode的页面上看到有丢掉块的话,就需求将这个块先get到本地,在put上去。例如:

  1. hdfsdfs-gethdfs://ns1/test1/dt=2016-07-24/000816_0.lzo
  2. hdfsdfs-put-f000816_0.lzohdfs://ns1/test1/dt=2016-07-24/000816_0.lzo
  3. hdfsdfs-chowntest1:test1hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo

前提条件需求将这个节点的datanode从头发动。

3、升降数据副本:

升降副本是一个无可奈何的办法,这样假设datanode有挂掉节点,就会添加丢掉块的几率。

详细降副本的指令如下:

  1. hdfsdfs-setrep-R-w2hdfs://ns1/tmp/test.db

升副本的指令如下:

  1. hdfsdfs-setrep-R-w3hdfs://ns1/tmp/test.db

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

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第9张

这样动态的升降副本能够处理。

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

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第10张

估测或许是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.

在这儿举一个比如:

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第11张

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第12张

经过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、删去旧数据

该计划是在无可奈何的状况下进行的,由于删掉的数据或许今后还得补回来,这样的话又是得要糟蹋必定的时刻。

别的在删去数据时分就得需求越过回收站才干算是真实删去,能够运用的指令如下:

Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)  Hadoop hdfs 磁盘 第13张

三、计划挑选

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

1、进步dfs.datanode.du.reserved的值;

2、关闭nodemanager进程;

3、升降副本;

4、发动hadoop自带的balance;

人工的定时调查,当到达希望的作用的时分便是康复成原样;在进步dfs.datanode.du.reserved的值就得需求考虑到datanode需求进行轮询的重启,这个时分就考虑到时刻距离,假设时刻过短就或许就丢,假设过长便是费的时刻比较多。

这种办法比如:比方在节假日的时分,某个收费口的车辆特别多,那个时分执法人员就会关闭这个收费站的出口,等车辆过的差不多的时分再给敞开。这次的计划有这个有点相似,当主机的dfs.datanode.du.reserved值高于现在磁盘运用的状况,namenode就不会分配数据过来了,经过升降副本和balance能快速的将本机的数据转移走。

四、结束语

本篇文章首要介绍了对hadoop数据呈现不均衡状况下能够运用的办法,及咱们状况下运用的计划!

转载请说明出处
知优网 » Hadoop集群datanode磁盘不均衡的解决方案(hadoop集群没有datanode)

发表评论

您需要后才能发表评论