hdfs datanode数据分布不均调整(hdfs balancer )

Hadoop集群Datanode数据倾斜,个别节点hdfs空间使用率达到95%以上,于是新增加了三个Datenode节点,由于任务还在跑,数据在不断增加中,这几个节点现有的200GB空间估计最多能撑20小时左右,所以必须要进行balance操作。

通过观察磁盘使用情况,发现balance的速度明显跟不上新增数据的速度!!!

跟踪了一下balance的日志,发现两个问题:
一是balance时原有的十几个节点都被列入了待balance的节点中,上面的数据分块移动到新增加的3个节点上,由于节点多,最迫切需要balance的几个节点轮到的机会很少;
二是balance的速度太慢了,Hadoop集群为了防止balance影响吞吐、I/O性能,默认balance的速度为1MB,这样一共8TB的数据需要balance,这需要太长时间了。

于是针对上述问题,进行了如下尝试:

  • 提高blance的速度,将默认的balance速度从1MB/s增大到50MB/s
#set balance to 50M/s
[hdfs@sudops.com hadoop]$ hdfs dfsadmin -setBalancerBandwidth 52428800
Balancer bandwidth is set to 52428800 for nn01.sudops.com/10.233.100.161:9000
Balancer bandwidth is set to 52428800 for nn02.sudops.com/10.233.100.162:9000
  • 调整balance的平衡比例:

将原来的%5 提高到20%,调整原则就是尽量先让balance影响到最需要平衡数据的节点。

简单说明一下:原有集群的hdfs占用率为80%,新增加3个节点后,集群hdfs的整体占用量为70%, 如果比例是%5的话,那么原有节点都在这个调整范围内,所以各个节点都要被balance,而接受balance的节点只有三个,所以轮到迫切需要balance的节点的概率就比较小;
如果调整到20%,那么原来使用量小于90%的节点都不会被balance,那几台占用量90%以上的节点才会被最先balance,这样只有3个节点符合这个条件,balance的精确性就高了很多。

综合以上两点,balance的效果好多了,解决了最紧迫的节点的磁盘占满的问题,balance的速度终于快于新增数据,20%时需要balance的数据为6TB左右,待这次balance结束后,再运行一次%5的balance,还有2TB的数据要balance,这样经过两次的balance的操作,集群基本平衡了。


hdfs dfsadmin -setBalancerBandwidth 52428800nohup hdfs balancer -threshold 20 &tail -F nohup.out

一、概述

hdfs 需要存写大量文件,有时磁盘会成为整个集群的性能瓶颈,所以需要优化 hdfs 存取速度,将数据目录配置多磁盘,既可以提高并发存取的速度,还可以解决一块磁盘空间不够的问题

Hadoop 环境部署可以参考我之前的文章:大数据Hadoop之——Hadoop 3.3.4 HA(高可用)原理与实现(QJM)

二、Hadoop DataNode多目录磁盘配置

1)配置hdfs-site.xml

在配置文件中$HADOOP_HOME/etc/hadoop/hdfs-site.xml添加如下配置:

<!-- dfs.namenode.name.dir是保存FsImage镜像的目录,作用是存放hadoop的名称节点namenode里的metadata-->
<property><name>dfs.namenode.name.dir</name><value>file:/opt/bigdata/hadoop/hadoop-3.3.4/data/namenode</value>
</property>
<!-- 存放HDFS文件系统数据文件的目录(存储Block),作用是存放hadoop的数据节点datanode里的多个数据块。 -->
<property><name>dfs.datanode.data.dir</name><value>/data1,/data2,/data3,/data4</value>
</property><!-- 设置数据存储策略,默认为轮询,现在的情况显然应该用“选择空间多的磁盘存”模式 -->
<property><name>dfs.datanode.fsdataset.volume.choosing.policy</name><value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
</property><!-- 默认值0.75。它的含义是数据块存储到可用空间多的卷上的概率,由此可见,这个值如果取0.5以下,对该策略而言是毫无意义的,一般就采用默认值。-->
<property><name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction</name><value>0.75f</value>
</property><!-- 配置各个磁盘的均衡阈值的,默认为10G(10737418240),在此节点的所有数据存储的目录中,找一个占用最大的,找一个占用最小的,如果在两者之差在10G的范围内,那么块分配的方式是轮询。 -->
<property><name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold</name>         <value>10737418240</value>
</property>

【温馨提示】此处的dfs.namenode.name.dirdfs.datanode.data.dir位置需要不一样,不能是一个文件夹,之前设置成一个文件夹报错ERROR org.apache.hadoop.hdfs.server.common.Storage: It appears that another node 1003@iZ2zeh8q22e14pvqr3bu01Z has already locked the storage directory:
【原因】是当namenode启动后,锁定了文件夹,导致datanode无法启动。

2)配置详解

1、 dfs.datanode.data.dir

HDFS数据应该存储Block的地方。可以是逗号分隔的目录列表(典型的,每个目录在不同的磁盘)。这些目录被轮流使用,一个块存储在这个目录,下一个块存储在下一个目录,依次循环。每个块在同一个机器上仅存储一份。不存在的目录被忽略。必须创建文件夹,否则被视为不存在。

2、dfs.datanode.fsdataset.volume.choosing.policy

当我们往 HDFS 上写入新的数据块,DataNode 将会使用 volume 选择策略来为这个块选择存储的地方。通过参数 dfs.datanode.fsdataset.volume.choosing.policy 来设置,这个参数目前支持两种磁盘选择策略

  • round-robin:循环(round-robin)策略将新块均匀分布在可用磁盘上。配置:org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy;实现类:RoundRobinVolumeChoosingPolicy.java
  • available space:循环(round-robin)策略将新块均匀分布在可用磁盘上。配置:org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy;实现类:AvailableSpaceVolumeChoosingPolicy.java

这两种方式的优缺点:

  • 采用轮询卷存储方式虽然能保证每块盘都能得到使用,但是在长期运行的集群中由于数据删除和磁盘热插拔等原因,可能造成磁盘空间的不均
  • 所以最好将磁盘选择策略配置成第二种,根据磁盘空间剩余量来选择磁盘存储数据块,这样能保证节点磁盘数据量平衡IO压力被分散。
3、dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction

它的含义是数据块存储到可用空间多的卷上的概率仅在 dfs.datanode.fsdataset.volume.choosing.policy 设置为 org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy 时使用。此设置控制将多少百分比的新块分配发送到可用磁盘空间比其他卷更多的卷。此设置应在 0.0 - 1.0 的范围内,但在实践中为 0.5 - 1.0,因为没有理由希望具有较少可用磁盘空间的卷接收更多块分配。

4、dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold

配置各个磁盘的均衡阈值的,默认为10G(10737418240),在此节点的所有数据存储的目录中,找一个占用最大的,找一个占用最小的,如果在两者之差在10G的范围内,那么块分配的方式是轮询。

  • 所有的 volumes 磁盘可用空间差距没有超过10G,那么这些磁盘得到的最大可用空间和最小可用空间差值就会很小,这时候就会使用轮询磁盘选择策略来存放副本。
  • 如果 volumes 磁盘可用空间相差大于10G,那么可用空间策略会将 volumes 配置中的磁盘按照一定的规则分为highAvailableVolumes 和 lowAvailableVolumes。

重启HDFS集群

stop-dfs.sh && start-dfs.sh

3)动态刷新hdfs/yarn配置

如果线上还有任务在执行,不能重启,可以执行以下命令让修改后的hdfs/yarn配置生效

1、动态刷新hdfs配置

如果是HA集群则在两个namenode节点上执行

# 默认端口是9000
hdfs dfsadmin -fs hdfs://local-168-182-110:8082 -refreshSuperUserGroupsConfiguration
hdfs dfsadmin -fs hdfs://local-168-182-113:8082 -refreshSuperUserGroupsConfiguration# 查看状态
hdfs haadmin -getAllServiceState
2、动态刷新yarn配置

如果是HA集群则在两个namenode节点上执行

yarn rmadmin -fs hdfs://local-168-182-110:8082 -refreshSuperUserGroupsConfiguration
yarn rmadmin -fs hdfs://local-168-182-113:8082 -refreshSuperUserGroupsConfiguration# 查看状态
yarn rmadmin -getAllServiceState

4)检查

web地址:
http://local-168-182-110:9870/
http://local-168-182-113:9870/
在这里插入图片描述
在这里插入图片描述

【温馨提示】发现少了一个节点,这是因为namenode与datanode混部,导致磁盘被占的原因。虽然也有一些解决方案,但不是很好,所以建议最好namenode和datanode不要混部。

在这里插入图片描述

三、Hadoop HDFS 数据平衡原理

在HDFS中,DataNode 将数据块存储到本地文件系统目录中,具体的目录可以通过配置 hdfs-site.xml 里面的 dfs.datanode.data.dir 参数。在典型的安装配置中,一般都会配置多个目录,并且把这些目录分别配置到不同的设备上,比如分别配置到不同的HDD(HDD的全称是Hard Disk Drive)和SSD(全称Solid State Drives,就是我们熟悉的固态硬盘)上。

当我们往HDFS上写入新的数据块,DataNode 将会使用volume选择策略来为这个块选择存储的地方。目前Hadoop支持两种volume选择策略:round-robin 和 available space,我们可以通过dfs.datanode.fsdataset.volume.choosing.policy 参数来设置。

在这里插入图片描述

数据平衡过程由于平衡算法的原因造成它是一个迭代的、周而复始的过程。每一次迭代的最终目的是让高负载的机器能够降低数据负载,所以数据平衡会最大程度上地使用网络带宽。下图 数据平衡流程交互图显示了数据平衡服务内部的交互情况,包括 NameNode 和 DataNode。

在这里插入图片描述

  • 数据平衡服务首先要求 NameNode 生成 DataNode 数据分布分析报告。
  • 选择所有的 DataNode 机器后,要求 NameNode 汇总数据分布的具体情况。
  • 确定具体数据块迁移路线图,保证网络内最短路径,并且确保原始数据块被删除。
  • 实际开始数据块迁移任务。
  • 数据迁移任务完成后,通过 NameNode 可以删除原始数据块。
  • NameNode 在确保满足数据块最低副本条件下选择一块数据块删除。
  • NameNode 通知数据平衡服务任务全部完成。

HDFS 数据在各个数据节点间可能保存的格式不一致。当存放新的数据块 (一个文件包含多个数据块) 时,NameNode 在选择数据节点作为其存储地点前需要考虑以下几点因素:

  • 当数据节点正在写入一个数据块时,会自动在本节点内保存一个副本。
  • 跨节点备份数据块。
  • 相同节点内的备份数据块可以节约网络消耗。
  • HDFS 数据均匀分布在整个集群的数据节点上。

四、Hadoop HDFS 数据平衡实战操作

格式:

hdfs balancer -help
Usage: java Balancer[-policy <policy>]    the balancing policy: datanode or blockpool[-threshold <threshold>]    Percentage of disk capacity[-exclude [-f <hosts-file> | comma-sperated list of hosts]]    Excludes the specified datanodes.[-include [-f <hosts-file> | comma-sperated list of hosts]]    Includes only the specified datanodes.

参数详解:

  • -threshold:某datanode的使用率和整个集群使用率的百分比差值阈值,达到这个阈值就启动hdfs balancer,取值从1到100,不宜太小,因为在平衡过程中也有数据写入,太小无法达到平衡,默认值:10
  • -policy:分为blockpool和datanode,前者是block pool级别的平衡后者是datanode级别的平衡,BlockPool 策略平衡了块池级别和 DataNode 级别的存储。BlockPool 策略仅适用于 Federated HDFS 服务
  • -exclude:不为空,则不在这些机器上进行平衡
  • -include:不为空,则仅在这些机器上进行平衡
  • -idleiterations:最大迭代次数

参数调整:

  • dfs.datanode.balance.bandwidthPerSec = 31457280 ,指定DataNode用于balancer的带宽为30MB,这个示情况而定,如果交换机性能好点的,完全可以设定为50MB,单位是Byte,如果机器的网卡和交换机的带宽有限,可以适当降低该速度,默认是1048576(1MB),hdfs dfsadmin-setBalancerBandwidth 52428800可以通过命令设置
  • -threshold默认设置为10,参数取值范围0-100,参数含义:判断集群是否平衡的目标参数,每一个 datanode 存储使用率和集群总存储使用率的差值都应该小于这个阀值 ,理论上,该参数设置的越小,整个集群就越平衡,但是在线上环境中,hadoop集群在进行balance时,还在并发的进行数据的写入和删除,所以有可能无法到达设定的平衡参数值
  • dfs.datanode.balance.max.concurrent.moves = 50,指定DataNode上同时用于balance待移动block的最大线程个数
  • dfs.balancer.moverThreads:用于执行block移动的线程池大小,默认1000
  • dfs.balancer.max-size-to-move:每次balance进行迭代的过程最大移动数据量,默认10737418240(10GB)
  • dfs.balancer.getBlocks.size:获取block的数量,默认2147483648(2GB)
  • dfs.balancer.getBlocks.minblock-size:用来平衡的最小block大小,默认10485760(10MB)
  • dfs.datanode.max.transfer.threads:建议为16384),指定用于在DataNode间传输block数据的最大线程数。

简单使用:

# 启动数据平衡,默认阈值为 10%
hdfs balancer# 默认相差值为10% 带宽速率为10M/s,过程信息会直接打印在客户端 ctrl+c即可中止
hdfs balancer -Ddfs.balancer.block-move.timeout=600000 #可以手动设置相差值 一般相差值越小 需要平衡的时间就越长,//设置为20% 这个参数本身就是百分比 不用带%
hdfs balancer -threshold 20#如果怕影响业务可以动态设置一下带宽再执行上述命令,1M/s
hdfs dfsadmin -setBalancerBandwidth 1048576#或者直接带参运行,带宽为1M/s
hdfs balancer -Ddfs.datanode.balance.bandwidthPerSec=1048576 -Ddfs.balancer.block-move.timeout=600000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/452963.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Elasticsearch】从入门到精通

目前java常见的针对大数据存储的方案并不多&#xff0c;常见的就是mysql的分库分表、es存储 这里偏向es存储方案&#xff0c;es不同的版本之间其实差异还挺大的&#xff0c;本篇博文版本Elasticsearch 7.14.0 Springboot整合Easy-Es Easy-Es官方文档 Elasticsearch的初步认识 …

【操作系统·考研】磁盘和固态磁盘

1.磁盘 1.1 概述 磁盘(Disk)是由表明涂有磁性物质的物理盘片&#xff0c;通过一个称为磁头的导体线圈从磁盘存取数据。 在读/写期间&#xff0c;磁头固定&#xff0c;下面的磁盘在高速旋转。 磁盘是可共享设备(分时共享)&#xff0c;是指某段时间内可以有多个用户进行访问&a…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(六)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十四章&#xff1a;使用卷积神经网络进行深度计算机视觉 尽管 IBM 的 Deep Blue 超级计算机在 1996 年击败了国际象棋世界冠军…

从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能

前言 学习资料&#xff1a; TensorRT 源码示例 B站视频&#xff1a;TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码&#xff1a;cookbook → 07-Tool → trtexec 官方文档&#xff1a;trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…

Linux Shell命令系列--basename获取基本文件名

一、目的 学习linux shell编程的第一步就是熟悉linux的各种命令的使用&#xff0c;本篇开始逐次介绍一些常用linux shell命令。 今天我们来讲解basename命令的使用。 二、介绍 1、基本概念 basename命令首先去除字符串末尾多余的斜杠&#xff08;如果有的话&#xff09;&#…

Java代码实现基数排序算法(附带源码)

基数排序是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。由于整数也可以表达字符串&#xff08;比如名字或日期&#xff09;和特定格式的浮点数&#xff0c;所以基数排序也不是只能使用于整数。 1. 基数排序…

STC系列单片机的中断系统

目录 一、中断系统的定义 二、STC15系列单片机的中断请求源及结构图 三、中断查询表以及触发方式 四、在keil c中如何声明中断函数 五、外部中断 六、基于STC15芯片实战中断系统的使用 &#xff08;1&#xff09;外部中断2/外部中断3来检测门的开关状态 &#xff08;2&a…

合并分支rebase和merge的区别

文章目录 一、前言1.1、master分支1.2、dev分支 二、合并2.1、git merge2.2、git rebase 三、总结四、最后 一、前言 实际开发工作的时候&#xff0c;我们都是在自己的分支开发&#xff0c;然后将自己的分合并到主分支&#xff0c;那合并分支用2种操作&#xff0c;这2种操作有…

工信部颁发的《计算机视觉处理设计开发工程师》中级证书

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

数据安全加密系统的核心目的是什么

随着信息化时代的快速发展&#xff0c;数据安全问题逐渐成为人们关注的焦点。数据一旦被非法获取或篡改&#xff0c;可能会给个人、企业甚至国家带来巨大的损失。因此&#xff0c;构建一个高效的数据安全加密系统&#xff0c;是确保数据安全的重要手段。 数据安全加密系统的核心…

Vue 学习随笔系列九 -- 表格中插入图片、背景、自定义表头

表格中插入图片和icon 文章目录 表格中插入图片和icon一、如何插入图片1、代码2、效果 二、文字添加背景1、代码2、效果 三、表头悬浮提示语四、表头添加图标 一、如何插入图片 1、代码 <template><div><el-tablesize"small"borderv-loading"l…

Spring 源码解读(五):@Conditional及其衍生扩展注解(5千字大章)

github地址&#xff1a;https://github.com/cass-pwx/conditional-demo 1、概述 条件装配是Spring Boot一大特点&#xff0c;根据是否满足指定的条件来决定是否装配 Bean &#xff0c;做到了动态灵活性&#xff0c;starter的自动配置类中就是使用Conditional及其衍生扩展注解…