【HDFS实战】HDFS上的数据均衡

news2024/11/16 7:54:02

HDFS上的数据均衡简介

文章目录

  • HDFS上的数据均衡简介
    • 重新平衡数据节点之间的数据块
      • 相关命令
    • 重新平衡DN内磁盘间的数据
      • 相关命令
        • Plan
        • Execute
        • Query
        • Cancel
        • Report
      • 相关配置
      • 调试

HDFS上的balance目前有两类:

  1. Balancer:节点之间的balance
  2. Disk Balancer:磁盘之间的balance

NN增加新块时的默认策略(默认3副本)

  1. 将块的一份副本存储在接收写入请求的DN节点上;
  2. 在第一份副本所在DN的机架中寻找另一个DN,存放一份新副本。
  3. 在不同机架的DN上写入第三份副本。

重新平衡数据节点之间的数据块

入口Issue HADOOP1652

当一个新的数据节点加入hdfs集群时,它里面并没有数据。 因此分配给新机器的任何map任务很可能不会读取本地数据,从而增加了网络带宽的使用。 另一方面,当某些数据节点满了时,新的数据块只会被放置在非满的数据节点上,从而降低了它们的读取并行度。

这个特性的目的是种在集群出现不平衡时,在数据节点间重新分配数据块。

由于多种相互竞争的考虑因素,数据可能不会均匀地放置在 DNs 上。 HDFS 为管理员提供了一个工具,可以分析数据块的放置并重新平衡 DataNode 上的数据。Balancer 就是重新平台的工具,Banlancer有两种使用模式:

  1. 手动工具,均衡退出条件:
    • 集群是平衡的
    • 迭代次数超过阈值(默认5)
    • 没有块可以迁移
    • 集群正在升级
    • 发生错误
  2. 运行服务模式 (3.3.0版本开始支持 HDFS-13783)
    • 默认按一定时间间隔进行数据均衡。
    • 可以设置dfs.balancer.service.interval 来控制每轮均衡之间的间隔。
    • 当遇到意外异常时,会尝试多次才停止服务,这是由 dfs.balancer.service.retries.on.exception 设置的。

数据均衡的交互图

在这里插入图片描述

方案应满足以下要求:

  1. 保证数据可用性保证,即在重新平衡时,不会减少块具有的副本数量或块驻留的机架数量。
  2. 提供执行和中断重新平衡的管理员级别的命令。
  3. 应限制重新平衡,以便重新平衡不会导致名称节点太忙而无法服务任何传入请求或使网络饱和。

相关命令

 hdfs balancer
          [-policy <policy>]
          [-threshold <threshold>]
          [-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>]
          [-runDuringUpgrade]
COMMAND_OPTIONDescription
-policy datanode(默认): 如果每个数据节点都是平衡的,集群就是平衡的。blockpool: 如果每个数据节点的每个块池都是平衡的,那么集群就是平衡的。
-threshold 磁盘容量的百分比。这覆盖了默认的阈值。
-exclude -f | 将指定的数据节点排除在平衡器的平衡范围之外。
-include -f | 只包括要被平衡器平衡的指定数据节点。
-source -f | 只挑选指定的数据节点作为源节点。
-blockpools 平衡器将只在这个列表中包括的区块池上运行。
-idleiterations 退出前的最大空闲迭代次数。这覆盖了默认的idleiterations(5)。
-runDuringUpgrade是否在正在进行的HDFS升级中运行平衡器。这通常是不需要的,因为它不会影响过度使用的机器上的使用空间。

注意:blockpool策略优先级高于数据节点策略。

除了上述命令选项,从2.7.0开始,引入了钉住功能,以防止某些副本被balancer/mover移动。这个钉住功能默认是禁用的,可以通过配置属性 dfs.datanode.block-pinning.enabled 来启用。当启用时,这个功能只影响写到 create() 调用中指定的特定节点的块。当我们想保持数据的局部性时,这个功能很有用,比如HBase Regionserver的应用。

重新平衡DN内磁盘间的数据

入口Issue HDFS-1312

数据节点存储数据到其存储目录不均匀,导致某些磁盘间的使用差值比较大。 目前的解决方式是:

  • 手动重新平衡存储目录中的块
  • 停用节点并稍后读取它们

在利用所有可用的主轴和以相同的速率填充磁盘之间存在权衡。 可能的解决方案包括:

  • 在数据节点上放置新块时,对较少使用的磁盘进行更重的权重。 在写入繁重的环境中,这仍将利用所有主轴,随着时间的推移均衡磁盘使用。
  • 在本地重新平衡块。 当在旧集群节点中添加/替换磁盘时,这将有助于均衡磁盘使用。

数据节点应主动管理其本地磁盘,因此不需要人工干预。

磁盘平衡器是一个命令行工具,它在数据节点的所有磁盘上均匀地分配数据。这个工具与Balancer不同,Balancer负责整个集群的数据平衡。会出现数据可能在一个节点的磁盘之间有不均匀的分布的场景。这可能是由于大量的写入和删除或由于磁盘更换而发生的。这个工具对一个给定的数据节点进行操作,将块从一个磁盘移动到另一个磁盘。

磁盘平衡器通过创建计划来运行,并继续在数据节点上执行该计划。 计划是一组语句,描述应在两个磁盘之间移动多少数据。 计划由多个移动步骤组成。 移动步骤具有源磁盘、目标磁盘和要移动的字节数。 可以针对操作数据节点执行计划。 磁盘平衡器不应干扰其他进程,因为它会限制每秒复制的数据量。

要配置磁盘平衡器,可以在 hdfs-site.xml 中将 dfs.disk.balancer.enabled 设置为 true或者false

相关命令

Plan

可以通过运行以下命令对给定的数据节点运行plan命令

hdfs diskbalancer -plan node1.mycluster.com
COMMAND_OPTIONDescription
-out允许用户控制计划文件的输出位置。
-bandwidth由于 DN 正在运行并且可能正在运行其他作业,因此磁盘平衡器限制每秒移动的数据量。 该参数允许用户设置要使用的最大带宽。 不需要设置,因为如果未指定,diskBalancer 将使用默认带宽。单位呢?
-thresholdPercentage由于我们针对数据节点的快照进行操作,因此移动操作有一个容差百分比来声明成功。 如果用户指定 10% 并且移动操作的大小为 20GB,如果我们可以移动 18GB,则该操作被认为是成功的。 这是为了实时适应DN的变化。 不需要此参数,如果未指定,则使用默认值。
-maxerror最大错误允许用户指定在我们中止移动步骤之前必须失败多少块复制操作。 再次强调,这不是必需的参数,如果未指定,则使用系统默认值。
-v详细模式,指定此参数会强制计划命令在标准输出上打印出计划的摘要。
-fs指定要使用的NN。 如果未指定,则使用配置中的默认值。

plan 命令写入两个输出文件。 它们是 <nodename>.before.json(在磁盘平衡器运行之前捕获集群的状态)和 <nodename>.plan.json

Execute

执行命令采用计划命令,针对生成计划的数据节点执行它。

hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json

这通过从计划文件中读取数据节点的地址来执行计划。 当 DiskBalancer 执行计划时,这是一个可能需要很长时间的异步过程的开始。 因此,查询命令可以帮助获取执行命令的当前状态。

COMMAND_OPTIONDescription
-skipDateCheck跳过日期检查并强制执行计划。

Query

查询命令从数据节点获取磁盘平衡器的当前状态。

hdfs diskbalancer -query nodename.mycluster.com
COMMAND_OPTIONDescription
-vVerbose mode, Prints out status of individual moves

Cancel

取消命令取消正在运行的计划。 重新启动数据节点与取消命令具有相同的效果,因为数据节点上的计划信息是暂时的。

hdfs diskbalancer -cancel /system/diskbalancer/nodename.plan.json

or

hdfs diskbalancer -cancel planID -node nodename

可以使用查询命令从数据节点读取planID。

Report

报告命令提供将从运行磁盘平衡器中受益的指定节点或顶级节点的详细报告。 节点可以由主机文件或逗号分隔的节点列表指定。

hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID|IP|Hostname>,...]

or

hdfs diskbalancer -fs http://namenode.uri -report -top topnum

相关配置

磁盘平衡器的配置在hdfs-site.xml文件中

SettingDescription
dfs.disk.balancer.enabled此参数控制是否为集群启用磁盘平衡器。 如果不启用,任何执行命令都会被datanode拒绝。默认值为true。
dfs.disk.balancer.max.disk.throughputInMBperSec这控制复制数据时磁盘平衡器消耗的最大磁盘带宽。 如果指定 10MB 之类的值,则磁盘平衡器平均只会复制 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。
dfs.disk.balancer.plan.valid.interval磁盘平衡器计划有效的最长时间。 支持以下后缀(不区分大小写):ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)来指定时间(如2s、2m、1h等)。 如果未指定后缀,则假定为毫秒。 默认值为 1d

dfs.disk.balancer.plan.valid.interval从版本3.1.0开始支持。

调试

磁盘平衡器生成两个输出文件。nodename.before.json 包含我们从名称节点读取的集群状态。 该文件包含有关数据节点和磁盘的详细信息。

nodename.plan.json 包含特定节点的计划。 该计划文件包含一系列步骤。 步骤作为数据节点内的一系列移动操作来执行。

要区分节点之前和之后的状态,您可以重新运行 plan 命令并将新的 nodename.before.json 与旧的before.json 进行比较,或者针对该节点运行 report 命令。

要查看运行计划的进度,请运行带有选项 -v 的查询命令。 这将打印出一组步骤 - 每个步骤代表从一个磁盘到另一个磁盘的移动操作。

移动速度受到指定带宽的限制。 带宽的默认值设置为 10MB/秒。 如果您使用 -v 选项进行查询,您将看到以下值。

  "sourcePath" : "/data/disk2/hdfs/dn",

  "destPath" : "/data/disk3/hdfs/dn",

  "workItem" :

    "startTime" : 1466575335493,

    "secondsElapsed" : 16486,

    "bytesToCopy" : 181242049353,

    "bytesCopied" : 172655116288,

    "errorCount" : 0,

    "errMsg" : null,

    "blocksCopied" : 1287,

    "maxDiskErrors" : 5,

    "tolerancePercent" : 10,

    "bandwidth" : 10

source path - 迁移数据的源路径.

dest path - 迁移数据的目标路径.

start time - 是以毫秒为单位的的开始时间

seconds elapsed - 每当更新统计数据时都会更新。 这可能比现实时间慢。

bytes to copy - 应该复制的字节数。 我们复制正负一定的百分比。 通常,您会看到 bytesCopied – 作为小于要复制的字节的值。 在默认情况下,移动字节数在 10% 以内就足够了.

bytes copied - 从源磁盘移动到目标磁盘的实际字节数.

error count - 每次遇到错误时,我们都会增加错误计数。 只要错误计数保持小于最大错误计数(默认值为 5),我们就会尝试完成此移动。 如果我们达到最大错误计数,我们将放弃当前步骤并执行计划中的下一步。

error message - 当前报告最后一条错误消息的单个字符串。 较旧的消息应该位于数据节点日志中。

blocks copied - 复制的块数

max disk errors - 用于此移动步骤的配置。 目前,它将报告默认配置值,因为用于控制每个步骤的这些值的用户界面尚未到位。尚未实现

tolerance percent - 这表示我们在移动数据时可以偏离多少。 在繁忙的集群中,这允许管理员说,计算一个计划,但我知道这个节点正在被使用,所以如果磁盘平衡器可以达到要复制的字节的 +/- 10% 就可以了。

bandwidth - 这是磁盘平衡器使用的最大聚合源磁盘带宽。 移动块后,磁盘平衡器计算以指定带宽移动该块应花费多少秒。 如果实际移动花费的时间少于预期,则磁盘平衡器将在该持续时间内休眠。 请注意,当前所有移动都是由单个线程顺序执行的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# WinForm 学习记录

1.为项目添加dll引用 在“解决方案资源管理器”面板中选择项目&#xff0c;单机鼠标右键&#xff0c;弹出菜单中选择“添加”->“引用”打开引用管理器&#xff0c;选择浏览添加自己需要的dll文件即可 2.位移运算符使用技巧 在进行位移运算时&#xff0c;当数值的二进制数…

设计模式学习笔记——你真的学透单例模式了吗

你真的学透单例模式了吗 一、概述 单例模式&#xff08;Singleton Pattern&#xff09;指确保一个类在任何情况下都绝对只有一个实例&#xff0c;并提供一个全局访问点&#xff0c;属于创建型设计模式 二、类图 三、通用写法 public class SingletonTest {public static vo…

使用docker安装redis,修改密码

1、搜索镜像 docker search redis 2、拉取镜像 docker pull redis 3.创建容器 前边是宿主机端口 后面是docker使用的端口 docker run --name redis -p 6379:6379 redis-test --requirepass 123456 这里密码设置为123456 4、如何修改密码 现有的redis创建密码或修改密码…

Python学习——字符串

一、字符串 字符串也是基本数据类型&#xff0c;是一个不可变的字符序列&#xff0c;字符串可以用单引号&#xff0c;双引号&#xff0c;三引号进行定义。 字符串的驻留机制&#xff0c;简而言之&#xff0c;就是相同的字符串只保留一个&#xff0c;后续创建相同字符串的时候&a…

【漏洞案例】云上攻防-记一次打穿云上内网的攻防实战

0x01 外网打点&#xff0c;但在云上 目标单位就给出了一个子域名和一个IP&#xff0c;访问给出的子域名就一个登录框&#xff0c;测试了下忘记密码处有用户名枚举&#xff0c;但登录功能做了登录失败处理&#xff0c;知道用户名也无法进行爆破。 登录时会调用api.target.com域…

CICflowmeter安装使用

项目地址&#xff1a;https://github.com/ahlashkari/CICFlowMeter前置条件&#xff1a;maven&#xff0c;winpcap或其他抓包工具&#xff0c;ideal或 Eclipse 用 ideal 打开项目&#xff0c;发现还需要 jnetpcap 包&#xff0c;但是 maven 仓库好像没有&#xff0c;自己编译 …

思科(Cisco)日志分析工具

作为网络安全管理员&#xff0c;实时监控和分析思科防火墙日志至关重要。对于安全网络&#xff0c;管理员需要&#xff1a; 检测各种网络攻击&#xff0c;并查明攻击的来源和类型&#xff08;思科实时日志查看器&#xff09;。跟踪思科防火墙上未经授权的登录尝试。获取有关活…

PHP OA协同办公管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP OA协同办公管理系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/87959360https://do…

wireshark抓包工具常用功能

wireshark工具面板如下图所示&#xff1a; 本文记录我比较常用的功能。如果有大佬还用过其他功能麻烦指点一二。 抓包、查找、过滤、数据分析。 菜单工具栏&#xff1a; 设置时间戳格式&#xff1a; 为了方便自己查看&#xff0c;把时间戳格式设置为自己认为比较好看的格式…

ThinkPHP6 请求

ThinkPHP6 请求 前言一、 获取请求二、request其他方法三, 请求信息总结 前言 什么是请求&#xff0c;就是 G E T 和 _GET和 G​ET和_POST类似的东西 一、 获取请求 获取请求可以使用$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量&#xff0c;也可…

Android——快速设置Quick Settings Tile(创建自定义快速设置磁贴)

Android——快速设置Quick Settings Tile&#xff08;创建自定义快速设置磁贴&#xff09; 简介快速设置磁贴的使用场景创建磁贴创建自定义图标创建并声明你的tile服务 管理你的tile服务TileService生命周期选择监听模式Active mode (推荐)Non-active mode Tile状态更新Tile处理…

字节跳动云原生大数据平台运维管理实践

云原生大数据是大数据平台新一代架构和运行形态。随着字节跳动内部业务的快速增长&#xff0c;传统大数据运维平台的劣势开始逐渐暴露&#xff0c;如组件繁多&#xff0c;安装运维复杂&#xff0c;与底层环境过度耦合&#xff1b;对业务方来说缺少开箱即用的日志、监控、告警功…

第7讲:使用ajax技术实现弹出商品详情提示功能(xml数据)

使用ajax技术使用ajax技术实现弹出商品详情提示功能&#xff0c;本案例使用原生态xmlhttprequest对象&#xff0c;GET方法异步通讯&#xff0c;后台使用map保存搜索数据&#xff0c;查询到对应数据后&#xff0c;返回xml格式数据&#xff0c;前端使用responseXML属性返回xml格式…

Android模拟器无法启动

在Android 13版本上&#xff0c;关于“复制”有了新的变化&#xff0c;但是我在我的小米手机&#xff08;也是Android 13版本的&#xff09;上测试没有看到对应的变化&#xff0c;所以想运行一个Android 13的模拟器来测试看看&#xff0c;结果死活运行不起来&#xff0c;一直卡…

el-dialog父子传值弹窗实现(弹窗内容较多时分开写)

需求&#xff1a;父组件点击按钮后打开弹窗&#xff0c;但是因为弹窗内容巨多&#xff0c;直接提取出来&#xff0c;只要在父组件点击时才显示弹窗&#xff0c;并且传递值给弹窗做数据回显&#xff0c;编辑或者新增功能都可以。 1.首先建立父子关系 创建个弹窗组件dialog.vue&…

HTML5+CSS3+JS小实例:悬停滚动文字的导航栏

实例:悬停滚动文字的导航栏 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=…

Sql Server 获取连续日期时间

获取连续日期时间 在项目中&#xff0c;有时候需要按日期/时间统计&#xff0c;例如2023-06-21至2023-06-28期间每一天的数据&#xff0c;如果某一天没有数据&#xff0c;也要查询出来&#xff0c;用NULL处理。 1.示例 2.连续日期效果SQL DECLARE StartDate DATE 2023-06-2…

Vision Pro中VR游戏空间边界为3×3米圆形

6月25日青亭网报道&#xff0c;此前我们已经报道了苹果visionOS有三种应用类型&#xff1a;FullSpaces、Windows、Volume。其中FullSpaces是仅显示一款应用的类型&#xff0c;后两种为共享空间可多窗口、多应用显示。 在FullSpaces模式下&#xff0c;苹果的一份文档显示visionO…

应用层控制灯,自动创建设备节点,ioctl函数

目录 1. 使用应用层控制灯 1.1. 撰写驱动的.c文件 1.2. 撰写应用层的.c文件 1.3. 撰写makefile文件 1.4. 测验 2. 自动创建设备节点 2.1. 函数分析 2.2. 撰写驱动.c文件 2.3. 修改应用层.c文件 2.4. 编写makefile文件 2.5. 在开发板安装.ko驱动 3. ioctl函数&#…

2023年最新互联网Java面试八股文出炉(附大厂P5-P8技术栈)

为什么感觉 Java 面试变难了&#xff1f; 几年前&#xff0c;你只需要简单的ssm框架&#xff0c;就能轻松找到一份Java的工作&#xff0c;但现在不一样了&#xff0c;随着涌入这个行业的人越来越多&#xff0c;同一个岗位需要筛选掉更多人&#xff0c;要求自然水涨船高&#x…