前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDFS 2.x 磁盘间数据均衡的一种可行办法

HDFS 2.x 磁盘间数据均衡的一种可行办法

原创
作者头像
mikealzhou
发布2018-01-19 19:29:46
2.6K0
发布2018-01-19 19:29:46
举报
文章被收录于专栏:大数据平台TBDS大数据平台TBDS

一、背景

当HDFS的datanode节点挂载多个磁盘时,往往会出现两种数据不均衡的情况:

(1) 不同datanode节点间数据不均衡;

(2) 挂载数据盘的磁盘间数据不均衡。

特别是这种情况:当datanode原来是挂载单数据磁盘,当磁盘占用率很高之后,再挂载新的数据盘。由于hadoop 2.x 版本并不支持 HDFS 的磁盘间数据均衡,因此,会造成老数据磁盘占用率很高,新挂载的数据盘几乎很空。在这种情况下,挂载新的数据盘就失去了扩容HDFS数据盘的意义。

二、解决方法

虽然hadoop官方并没有在hadoop 2.X 提供标准的磁盘间数据均衡方法,但是我们也可以通过一些其它途径来达到磁盘间数据均衡。

总体方法:通过升降HDFS数据的副本数量,“一减一增”过程中,“一减”过程中会将老数据盘的数据块删除一个副本,“一增”过程中会将增加的一个副本数据均衡写入到老数据盘和新数据盘。通过“一减一增”,使得一部分老数据盘的数据转移到新的数据盘。

代码语言:js
复制
升降数据副本:比如默认HDFS的副本数是3份。
(1)使用命令将HDFS的副本数降为2,此时HDFS会删除老数据盘上面的1份副本;
(2)再使用命令将HDFS的副本数升为3,此时HDFS会将新增的1份副本均匀分布在所有的磁盘(新老数据盘机会     均等地分布这一份副本数据);
理论上使用这种方法将整个HDFS数据执行一遍。(假设原来是一块数据盘,现在每个datanode新增一块数据盘)老的数据盘会减少 六分之一,减少的六分之一数据将会增加到新的数据盘。具体的计算过程如下:

假设原来磁盘的数据量为n GB,那么经过3副本降为2副本之后,老磁盘的数据量为:
n * 2/3
再经过副本2增加为3之后,老磁盘的数据量为:
n * 2/3 + n * 1/3 *1/2 = n * 5/6
因此,有 1/6 的数据从老磁盘迁移到新的磁盘。

升降副本是一个迫不得已的办法。如果在做升降副本过程中,datanode有节点挂掉,就会增加丢失数据块的几率。

因此,在做“一升一降”之前、执行的过程中,都需要检查HDFS是否健康。同时,当对大批量数据做均衡时,容易出现错误,需要对HDFS的子目录逐个做均衡。

三、具体操作办法

step1:检查HDFS健康程度:

代码语言:javascript
复制
su hdfs;
hadoop fsck /;

step2:检查各个目录的大小:

代码语言:javascript
复制
[hdfs@10]$ hadoop fs -du -h /
5.7 G       /app-logs 
677.9 G     /apps 
2.7 G       /backup 
0           /data
0           /group
365.3 M     /hdp
0           /mapred
1.1 G       /mr-history
1.1 T       /project
0           /system
33.1 G      /tmp 
197.0 G     /user

step3:对各个子目录(或者是子目录的子目录)进行副本数变更操作:

假如对HDFS的 /app-logs 子目录做变更,执行:

代码语言:javascript
复制
su hdfs;
hadoop fsck /app-logs;   ## 每次做变更之前很有必要检查集群HDFS健康程度
hadoop fs -setrep -R 2 /app-logs;  ## 将副本数量降为2
hadoop fsck /app-logs;   ## 很有必要每次做完变更副本之后检查集群HDFS健康程度
cd /data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/sbin/;
./start-balancer.sh -threshold 5;  ## 变更副本之后,做一次HDFS集群间的数据均衡
hadoop fs -setrep -R 3 /app-logs;  ## 将副本数量增为3,还原原来的副本数量
hadoop fsck /app-logs;   ## 很有必要每次做完变更副本之后检查集群HDFS健康程度
cd /data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/sbin/;
./start-balancer.sh -threshold 5;  ## 变更副本之后,做一次HDFS集群间的数据均衡

接下来再对HDFS的其它子目录实施同样的操作,直到把HDFS的所有目录都操作一遍。

四、进一步

    对HDFS做完一次 “一降一增” 操作之后,理论上老数据盘会减少1/6的数据,新盘增加这部分数据。 如果觉得效果还不够理想,可以再进行一次上面的降升操作,老数据盘会再次将一些数据迁移到新的数据盘,只是迁移量没有前一次那么大了(读者可以自行计算理论上会迁移多少数据量)。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、解决方法
  • 三、具体操作办法
  • 四、进一步
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档