HDFS集群磁盘倾斜不均衡的解决方案

本文探讨了HDFS中磁盘倾斜的原因及带来的性能问题,并提供了多种解决策略,包括使用数据均衡工具、升降数据副本等。

一、引起磁盘倾斜不均衡的可能原因有哪些
(1)扩容节点,向集群中添加新的数据节点
(2)数据节点之间的磁盘大小不一致

二、磁盘倾斜引起的性能问题
(1)MR程序无法很好地利用本地计算的优势
(2)机器之间无法达到更好的网络带宽使用率
(3)机器磁盘无法利用

三、解决磁盘倾斜的方案
(1)使用数据均衡工具手动balance
如果是cm,选择“重新平衡”;
如果是手动的hadoop集群,使用命令:
start-balancer.sh -threshold 20 -policy blockpool -include -f /tmp/ip.txt
上面的命令通过手工筛选出磁盘高的和磁盘低的放在ip.txt文件中,这样balance就只通过这文件里的了,另外还需要设置适当的threshold值,因为是多namespace的,所以需要选择blockpool模式。
另外带宽也是限制balance的一个因素,在hdfs-site.xml中是有设置的:

<property>  
    <name>dfs.datanode.balance.bandwidthPerSec</name>   
    <value>10485760</value>   
</property>

但是这个需要重启,hadoop提供了一个动态调整的命令:
hdfs dfsadmin -fs hdfs://ns1:8020 -setBalancerBandwidth 104857600
hdfs dfsadmin -fs hdfs://ns2:8020 -setBalancerBandwidth 104857600

(2)上下节点
其实将高磁盘的节点强制Decommission是最快最有效的方案。
下节点的时候可能会出现有ns不能正常下掉的情况,其实这个时候节点的数据大部分已经移出去了,可能有一些块卡在那边没有移出去。
这个时候只能一个一个节点将已经Decommissioned节点stop掉datanode进程,如果在namenode的页面上看到有丢失块的话,就需要将这个块先get到本地,在put上去。例如:
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个副本。这样动态的升降副本可以解决。
另外在升降副本的遇到一个BUG,过程中可能会出现夯住的情况,推测可能是namenode的replications模块有夯住情况,所以出现该情况执行kill掉进行,跳过该块再跑。
总结:之所以选择使用升降副本是因为它不受带宽的控制,另外在升降副本的时候hadoop是需要重新写数的,这个时候它会优先往磁盘低写数据,这样就能将磁盘高的数据迁移至磁盘低的。

(4)提高dfs.datanode.du.reserved值
官方解释为:适用于非分布式文件系统 (DFS) 使用的保留空间(字节/卷)。
通俗的意思:预留磁盘的一部分空间给操作系统用,这个参数主要是为了防止磁盘空间被写满导致的HDFS异常。通常系统默认保留5%的磁盘空间给操作系统用。
所以,当主机的dfs.datanode.du.reserved值高于目前磁盘使用的情况,namenode就不会分配数据过来了

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

(6)distcp方式(我没太明白为什么要用这个方式)
distcp与cp两者的区别如下:
CP的模式是不走mapreduce的;DISTCP的模式是走mapreduce的,所以它优先写有nodemanager的机器;
CP是单线程的,类似scp的模式,在执行速度上比DISTCP要慢很多。

(7)删除旧数据(我感觉是删除磁盘下的数据,而不是dfs数据)
该方案是在迫不得已的情况下进行的,因为删掉的数据可能以后还得补回来,这样的话又是得要浪费一定的时间。
另外在删除数据时候就得需要跳过回收站才能算是真正删除,可以使用的命令如下:
Hadoop dfs -rmr -skipTrash /tmp/output

四、应用场景
(1)在非机器磁盘故障的情况下,例如200节点的集群,有3或者4台dn节点出现磁盘爆满情况,常见的解决方案有:
因为爆满的主机数较少,可以采用上下节点方式解决

(2)考虑到有多达600台机器磁盘使用率达到94%,而且这部分高的机器是在同一个机房的,所以不能采用上下节点的方法,最好的办法如下:
1、提高dfs.datanode.du.reserved的值;
2、关闭nodemanager进程;
3、升降副本;
4、启动hadoop自带的balance;

五、注意区别HDFS节点之间数据不均衡与HDFS节点内磁盘数据不均衡
上面给出的是HDFS节点之间数据不均衡的解决方法,如果想要解决节点内磁盘数据不均衡,可以参考:
https://blog.youkuaiyun.com/Androidlushangderen/article/details/51776103

参考网址:
http://www.aboutyun.com/thread-19959-1-1.html https://blog.youkuaiyun.com/Androidlushangderen/article/details/51776103

<think> 我们正在讨论HDFS负载不均衡的原因。根据提供的引用,我们可以总结出几个关键点: 1. **节点间负载不均衡**:`hdfs balancer`命令主要负责同host节点之间的负载均,但无法解决单个节点内多磁盘之间的不均衡问题[^1]。 2. **机架感知限制**:HDFS负载均程序会将数据从一个机架移动到另一个机架,如果机架之间的数据量(例如rack1的磁盘剩余空间远小于rack2),负载均程序无法解决这种[^2]。 3. **带宽限制**:负载均过程中数据传输的带宽限制(默认1MB/s)可能导致均过程缓慢,影响整体效率[^3]。 4. **磁盘异构问题**:HDFS允许DataNode节点使用异构磁盘小、类型),但自动均机制可能无法完美处理这种情况[^4]。 5. **上传文件不均衡**:上传文件时,如果客户端集群中或上传方式当,可能导致数据分布均[^5]。 结合以上引用和HDFS的工作原理,我们可以系统地分析导致HDFS负载不均衡的原因: ### 一、架构设计层面的原因 1. **机架感知策略的局限性** HDFS默认的负载均算法遵循机架感知原则: - 优先在同一机架内进行数据块副本放置 - 同机架间的数据块移动受到限制[^2] 这导致当**整个机架的数据总量偏高时**(如新扩容机架),Balancer无法跨机架迁移数据块。 2. **存储类型异构性** - DataNode扩展磁盘时**新旧磁盘容量一致**(如4TB vs 10TB) - 尽管HDFS支持异构存储,但Balancer仅根据**磁盘使用率百分比**判断均性 设节点A磁盘容量$C_A$,使用量$U_A$;节点B容量$C_B$,使用量$U_B$,均条件为: $$ \left| \frac{U_A}{C_A} - \frac{U_B}{C_B} \right| \leq \delta \quad (\delta \text{为阈值,默认10%}) $$ - 若$C_A \ll C_B$,即使$U_A/C_A \approx U_B/C_B$,实际数据量$U_A$可能远小于$U_B$[^4] ### 二、操作配置层面的原因 3. **Balancer参数配置当** - **带宽限制过低**:默认1MB/s的迁移速度(`dfs.datanode.balance.bandwidthPerSec`) 在TB级集群中可能导致均过程持续数天[^3] ```xml <!-- 推荐生产环境设置为10~50MB/s --> <property> <name>dfs.datanode.balance.bandwidthPerSec</name> <value>10485760</value> <!-- 10MB/s --> </property> ``` - **阈值设置合理**:默认10%的磁盘使用率差异阈值可能过 对于小容量集群应降低阈值(如5%) 4. **数据写入模式不均衡** - 客户端**集中写入单一DataNode**: - 未启用`dfs.client.use.datanode.hostname`导致客户端直连特定IP - 客户端与部分DataNode网络延迟较低 - **热点文件频繁写入**:某时段量数据写入少数节点 ### 三、系统运行层面的原因 5. **节点内磁盘不均衡(Intra-Node Imbalance)** - DataNode多磁盘场景下,HDFS默认**轮询写入策略**可能失效: - 某些磁盘写满后,新数据仅写入剩余磁盘 - 磁盘故障导致数据分布到其他磁盘 - Balancer**处理同节点磁盘间的数据迁移**[^1] 6. **集群拓扑变化滞后** - **新增/下线节点后未及时触发Balancer** - **机架信息更新延迟**:当物理机架调整后,HDFS新加载拓扑映射 ### 四、特殊场景限制 7. **命名空间隔离(Federation架构)** - 在HDFS Federation中,每个命名空间独立管理数据块 - Global Balancer需跨命名空间协调,目前支持有限 8. **Balancer执行冲突** - 多个Balancer实例同时运行可能导致迁移冲突 - 未通过ZooKeeper协调任务(如HDFS-1312方案) §§ 解决方案提示 §§ - **节点内磁盘**:使用`diskbalancer`命令行工具(Hadoop 3.0+) - **跨机架均**:调整Balancer策略(需自定义开发) - **异构存储优化**:设置存储策略分层存储 §§ 相关问题 §§ 1. Hadoop 3.0的Diskbalancer如何解决单节点多磁盘不均衡? 2. 如何修改Balancer策略以实现跨机架数据迁移? 3. 为什么Balancer运行时需要限制网络带宽? 4. 如何监控HDFS集群的负载均状态? [^1]: `hdfs balancer`命令无法解决单节点内多磁盘不均衡问题 [^2]: 负载均程序受机架感知限制无法跨机架迁移数据 [^3]: 带宽限制参数影响Balancer执行效率 [^4]: 磁盘异构性导致容量与数据量的矛盾 [^5]: 上传文件方式当可能导致初始分布均 </think> ### 导致HDFS负载不均衡的主要原因分析 #### 一、机架感知策略的限制(核心原因) 1. **跨机架数据迁移禁止** HDFS Balancer默认**会跨机架迁移数据块**,这是设计上的关键限制[^2]。 - 若初始数据分布均(如rack1存储了60%数据,rack2仅40%) - Balancer只能在**同一机架内**调整数据分布 - 导致机架级不均衡无法解决 **数学表达**: 设机架$R_i$的存储负载为$L_i$,Balancer约束条件为: $$ \Delta L_{ij} = 0 \quad \forall i \neq j \quad \text{(机架间负载差值变)} $$ #### 二、节点内磁盘异构性问题 2. **单节点多磁盘不均衡** Balancer仅处理**节点间**均,无法解决单节点内多磁盘不均衡[^1][^4]: - 当DataNode配置多块异构磁盘(如4TB+10TB) - HDFS默认轮询写入策略可能导致小容量磁盘先满 - 后续数据只写入容量磁盘,造成节点内负载倾斜 **示例**: ```mermaid graph LR A[Datanode-A] --> |磁盘1: 4TB 已用90%| A1 A --> |磁盘2: 10TB 已用40%| A2 B[Datanode-B] --> |磁盘1: 4TB 已用85%| B1 ``` *Balancer会移动A节点内部的数据* #### 三、带宽限制与执行效率 3. **迁移速度瓶颈** 默认带宽限制严影响均效率[^3]: - 默认值仅1MB/s (`1048576 bps`) - 在PB级集群中,均可能需数周时间 - 新数据持续写入导致永远无法达到均状态 **优化方案**: ```xml <property> <name>dfs.datanode.balance.bandwidthPerSec</name> <value>10485760</value> <!-- 10MB/s --> </property> ``` #### 四、数据写入模式问题 4. **客户端写入偏好** 数据分布受客户端行为影响[^5]: - 客户端与特定DataNode网络延迟低时倾向直连 - 热点文件集中写入少数节点 - 使用非集群节点上传文件导致路由均 #### 五、特殊场景限制 5. **Balancer运行冲突** - 未通过ZooKeeper协调时,多个Balancer实例可能同时运行 - 相互冲突的迁移计划导致整体失效 6. **小文件场景** - 量小文件导致块分布统计偏差 - Balancer基于块数量(非实际数据量)决策 ### 关键解决方向 | 问题类型 | 解决方案 | |---------|---------| | 机架级不均衡 | 修改Balancer策略允许跨机架迁移 | | 单节点多磁盘均 | 启用Hadoop 3.0+的Diskbalancer | | 带宽瓶颈 | 调整`bandwidthPerSec`参数 + 错峰执行 | | 写入偏好 | 强制客户端通过Router访问集群 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值