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

一、背景

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

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

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

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

二、解决方法

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

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

升降数据副本:比如默认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健康程度:

su hdfs;
hadoop fsck /;

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

[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 子目录做变更,执行:

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的数据,新盘增加这部分数据。 如果觉得效果还不够理想,可以再进行一次上面的降升操作,老数据盘会再次将一些数据迁移到新的数据盘,只是迁移量没有前一次那么大了(读者可以自行计算理论上会迁移多少数据量)。

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何在CDSW上创建Git工程

在CDSW上有多中创建工程的方式(创建一个空的工程、模板工程、本地上传工程或者是创建git工程),前面的都比较好理解,那如何在CDSW上创建Git工程呢?本篇文...

36830
来自专栏别先生

一脸懵逼学习基于CentOs的Hadoop集群安装与配置(三台机器跑集群)

1:Hadoop分布式计算平台是由Apache软件基金会开发的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS)和MapReduce(Google...

28050
来自专栏我是攻城师

Spark Streaming如何使用checkpoint容错

61870
来自专栏LuckQI

Java大数据学习~Hadoop初识一了解其架构

9330
来自专栏灯塔大数据

每周学点大数据 | No.69 多机配置

No.69 多机配置 Mr. 王:在关于 Hadoop 内容介绍的最后,我们来谈谈如何把 Hadoop 配置在多台计算机上。 小可 :嗯,到目前为止,所有的程序...

33360
来自专栏码字搬砖

Impala原理、使用

简介: impala属于Cloudera,基于内存的,可用户实时的交互式查询。Cloudera建议Impala集群内存最少128G,Impalad与Data...

34930
来自专栏程序员笔录

Spark 开发环境搭建

本文是对初始接触 Spark 开发的入门介绍,说明如何搭建一个比较完整的 Spark 开发环境,如何开始应用相关工具。文中如有错误或者不当之处,敬请指正。

1.9K10
来自专栏祝威廉

StreamingPro 再次支持 Structured Streaming

之前已经写过一篇文章,StreamingPro 支持Spark Structured Streaming,不过当时只是玩票性质的,因为对Spark 2.0+ 版...

10230
来自专栏Hadoop实操

HDFS部署最佳实践

56840
来自专栏cloudskyme

Hadoop使用(二)

前提和设计目标 硬件错误 硬件错误是常态而不是异常。HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据。我们面对的现实是构成系统的组件...

374100

扫码关注云+社区

领取腾讯云代金券