HDFS负载平衡器
Hadoop的HDFS集群中DataNode之间很可能会出现分布不均匀的情况,比如新增了集群节点、删除节点等。当数据不均匀时,处理数据时会集中在某一些节点上,可能导致相关node节点的网络带宽消耗到瓶颈,而新增或数据较少的节点处于空闲状况。
在上面的情况下,可以通过HDFS的负载均衡器进行调整,使数据平均分布在各个Node节点上,均衡各项资源的性能,从而提升DataNode节点和集群的利用率。
balancer配置 命令行说明
Usage: hdfs balancer
[-policy <policy>] 平衡策略:datanode或blockpool,默认:datanode,如果datanode均衡,则集群均衡
[-threshold <threshold>] 磁盘容量百分比,集群平衡的条件,datanode间磁盘使用率相差阈值,区间:0~100
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]] 排除指定的数据节点。
[-include [-f <hosts-file> | <comma-separated list of hosts>]] 仅包括指定的数据节点。
[-source [-f <hosts-file> | <comma-separated list of hosts>]] 仅选取指定的数据节点作为源节点。
[-blockpools <comma-separated list of blockpool ids>] 平衡器将仅在此列表中包含的块池上运行。
[-idleiterations <idleiterations>] 退出前的连续空闲迭代次数(对于无穷大为-1)。
[-runDuringUpgrade] 是否在正在进行的HDFS期间运行平衡器升级。这个通常不需要,因为它不会影响过度使用机器上的已用空间。
注:-f <hosts-file> , 表示通过文件输入相关信息
支持的通用选项包括:
-conf <configuration file> 指定应用程序配置文件
-D <property=value> 定义给定属性的值
-fs <file:///|hdfs://namenode:port> 指定要使用的默认文件系统URL,覆盖'fs.defaultFS文件'来自配置的属性。
-jt <local|resourcemanager:port> 指定资源管理器
-files <file1,...> 指定要复制到map reduce群集的文件的逗号分隔列表
-libjars <jar1,...> 指定要包含在类路径中的jar文件的逗号分隔列表
-archives <archive1,...> 指定要在计算机上取消归档的归档文件的逗号分隔列表
balancer运行 命令说明
1、设置平衡数据传输带宽
hdfs dfsadmin -setBalancerBandwidth newbandwidth #命令
newbandwidth 表示可以使用的最大网络带宽,以每秒字节数为单位
2、默认运行
hdfs balancer #命令
3、指定阈值允许
hdfs balancer -threshold 5 #命令
阈值threshold 默认值为10(即相差值不超过10%)
-threshold 5 ,表示每个datanode上的磁盘使用量与集群中的总使用量相差不超过5%;
比如:
集群中各个节点的使用率:node1 - 80%;node2 - 50%;node3 - 30%
集群使用率:(80+50+30) / (100+100+100) = 53%
当阈值为10,各个节点平衡后的使用率的合理范围则未: 43% - 63%之间
HDFS磁盘均衡器(Disk Balancer)
一台Linux服务器,可以挂载多个磁盘,并且可以根据使用情况新增磁盘。
DataNode在写入block时,根据选择策略(循环策略或可用空间策略)来选择block的磁盘。
循环策略
在出现大量的写入和删除操作或更换操作时,会出现磁盘数据不均衡的情况。
可用空间策略
当新增磁盘后,该策略会导致一定时间内容,只往新的磁盘上写数据,导致新磁盘达到读写瓶颈,而其他磁盘则处于空闲状态。
磁盘均衡器是对DataNode进行操作,使DataNode内部数据在不同磁盘间平衡。
Disk Balancer数据传播报告
一、Volume data density metric(卷数据密度),计算步骤:
1、每个卷/磁盘上的理想存储量率 = 总的使用量 / 总存储量
2、单个卷/磁盘的存储率 = 当前卷的使用量 / 当前卷的总存储量
3、卷/磁盘的卷数据密度= 每个卷/磁盘上的理想存储量率 - 单个卷/磁盘的存储率
Volume data density metric(卷数据密度)的值为正数表示磁盘未充分利用,如果是负值则表示磁盘当前的利用率过高。
二、Node Data Density(节点数据密度),计算方式):
节点数据密度 = |卷/磁盘1的存储率| + |卷/磁盘2的存储率| + ……
注: 各个磁盘的存储率的绝对值的总行
Node Data Density(节点数据密度)较低时表示该服务器节点具有较好的扩展,较高的值表示该节点具有更倾斜的数据分布。
均衡器开启方式
磁盘均衡器设置
配置文件:hdfs-site. xml
参数 | 描述 |
dfs.disk.balancer.enabled | 该参数控制集群是否启用diskbalancer。如果不启用,任何execute命令都会被datanode拒绝。默认值为false。 |
dfs.disk.balancer.max.disk.throughputInMBperSec | 这控制磁盘平衡器在复制数据时消耗的最大磁盘带宽。如果指定的值是10MB,那么平均来说 diskbalancer 只会复制10MB/s。默认值为10MB/s |
dfs.disk.balancer.max.disk.errors | 设置两个磁盘之间的特定移动在放弃之前可以忽略的最大错误数的值。例如,如果一个计划要在3对磁盘之间进行复制,而第一个磁盘集遇到5个以上的错误,那么我们就放弃第一个复制并开始计划中的第二个复制。最大错误的默认值设置为5 |
dfs.disk.balancer.block.tolerance.percent | 容差百分比指定我们何时达到任何复制步骤所需的足够好的值。例如,如果指定10% ,那么接近目标值的10% 就足够了 |
dfs.disk.balancer.plan.threshold.percent | 计划中的卷数据密度的百分比阈值。如果一个节点的卷数据密度的绝对值超出了阈值,则意味着与磁盘对应的卷应该在计划中进行平衡。默认值是10 |
磁盘均衡器执行过程
一、设置计划
命令: hdfs diskbalancer -plan <datanode>
plan 命令的可选参数,允许用户控制计划的输出和执行:
命令选项 | 描述 |
-out | 允许用户控制计划文件的输出位置 |
-bandwidth | 由于 datanode 可能正在运行其他作业,所以 diskbalancer 限制每秒移动的数据量。此参数允许用户设置要使用的最大带宽。 |
-thresholdPercentage | 由于我们面向的是datanode 的snap-shot进行操作,因此移动操作有容忍百分比来宣布成功。如果用户指定10% 并且移动操作大小为20gb,如果我们可以移动18gb,那么该操作被认为是成功的。这是为了实时适应datanode中的变化。可选参数,如果未指定则使用默认值 |
-maxerror | maxerror允许用户指定在终止移动步骤之前必须有多少块复制操作失败。同样,这是个可选参数,如果没有指定,则使用系统默认值 |
-v | 详细模式,指定此参数将强制 plan 命令在 stdout 上打印计划的摘要 |
-f | - 指定要使用的名称。如果没有指定默认配置使用 |
plan 命令有两个输出文件, <nodename>.before.json(用来记录执行命令前的状态)、<nodename>.plan.json。
二、执行
命令:hdfs diskbalancer -execute <JSON file path>
注:这通过从计划文件读取 datanode 的地址来执行计划。
如:
hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json
三、查询
命令:hdfs diskbalancer -query <datanode>
注:query命令从datanode获取磁盘平衡器的当前状态。
四、取消
命令:
hdfs diskbalancer -cancel <JSON file path>
hdfs diskbalancer -cancel planID -node <nodename>
注:取消命令取消正在运行的计划。
五、汇报
命令:hdfs diskbalancer -fs http://namenode.uri -report
注:Report 命令提供指定节点的详细报告