DataNode节点下线速度优化

news2024/9/28 23:28:14

 目录

一、节点掉线或退役

1.1区分节点掉线和节点退役的区别

1.2 如何处理节点掉线出现的各种风暴

1.2.1 Datanode的block复制

1.2.2 控制节点掉线RPC风暴的参数

二、如何快速节点下线


一、节点掉线或退役


背景:5台数据节点,存储40T数据 block数1120万块左右,集群带宽限制480GB/s,标准节点配置是12*8T,当前存储数据50-60TB,block 80万左右。

1.1区分节点掉线和节点退役的区别


节点退役:首先正常将节点加入退役名单,先告诉namenode和yarn不要在往上提交新任务和写入数据了;然后等待节点上的数据块在集群中复制完成;这个时候该退役的节点是优先作为srcNode数据源的(优先选择退役中的节点作为复制数据源src,因为其无写入请求,负载低),其他节点从该退役节点复制数据块到其他节点的,所以这个时候该节点的负载会很高。所有数据块复制完毕,节点状态变成Decommissioned,可以从、界面查看。注意数据节点退役数据开始复制的时间也是10分30s后,并不是因为是主动退役而提前,因为nannode和datanode永远都是维持着简单的主从关系,namenode节点不会主动向datanode节点发起任何IPC调用,datanode节点需要配合namenode完成的所有操作都是通过两者心跳应答时携带的DatanodeCommand返回的。

节点掉线:比如强制停止datanode,物理机挂了(比如负载高掉线,突发网络故障,硬件故障等),这些都属于节点掉线,一般默认10分30s后(主要受两个参数控制)namenode会检测到该节点通信异常掉线。然后namenode根据该节点的ip,查出该节点所有的blockid,以及对应副本所在机器,通过心跳机制安排数据复制,这时候数据的复制,数据源不在是掉线节点,而是多个副本之一所在的节点,同样这时候副本复制也遵循机架感知,副本搁置策略。

尖叫提示:节点掉线和退役两者的区别不仅是数据的复制方式不同,还有就是namenode对Under-Replicated Blocks 的数据复制策略也是不一样的(数据块block复制的等级分成5种);极端的例子比如单副本节点退役数据不会丢失,单副本节点掉线则会数据真的丢失;

1.2 如何处理节点掉线出现的各种风暴


几十T, 甚至上百T, 上百万block的节点掉线,会出现大量的RPC风暴,在我们存在大量小文件的集群对namenode是很大的挑战,不仅影响生产性能,也会存在很大的隐患,尤其是对于带宽有限制瓶颈的集群。一般来说namenode检测datanode是否掉线的值是10*3s(心跳时间)+2*5min(namenode检测时间,参数是:dfs.namenode.heartbeat.recheck-interval)=10分30s。如果在10min30s内的时间内带宽持续打满,RPC请求延迟,datanode和namenode节点通信不畅,很容易造成其他节点的持续掉线,形成恶性循环,这种情况应该如何避免?

1.2.1 Datanode的block复制

NameNode 维护一个复制优先级队列,对于副本不足的文件 block 按优先级排序,仅剩下一个副本的文件 block 享有最高的复制优先级。所以从这里看集群两副本的话,只要有一个block出现异常,就只剩一个副本,就是最高优先级的块复制,会风暴模式复制,控制不好很容易影响集群性能,甚至搞挂集群。所以一般不建议集群副本因子是2。

如下block待复制的5个优先级队列:其实就在UnderReplicatedBlocks的私有方法getPriority张中,长这样:

/**HDFSversion-3.1.1.3.1, 保持低冗余块的优先队列*/
class LowRedundancyBlocks implements Iterable<BlockInfo> {
  /** The total number of queues : {@value} */
  static final int LEVEL = 5;
  /** The queue with the highest priority: {@value} */
  static final int QUEUE_HIGHEST_PRIORITY = 0;
  /** The queue for blocks that are way below their expected value : {@value} */
  static final int QUEUE_VERY_LOW_REDUNDANCY = 1;
  /**
   * The queue for "normally" without sufficient redundancy blocks : {@value}.
   */
  static final int QUEUE_LOW_REDUNDANCY = 2;
  /** The queue for blocks that have the right number of replicas,
   * but which the block manager felt were badly distributed: {@value}
   */
  static final int QUEUE_REPLICAS_BADLY_DISTRIBUTED = 3;
  /** The queue for corrupt blocks: {@value} */
  static final int QUEUE_WITH_CORRUPT_BLOCKS = 4;
  /** the queues themselves */
  private final List<LightWeightLinkedSet<BlockInfo>> priorityQueues
      = new ArrayList<>(LEVEL);
}

L1(最高):有数据丢失风险的块,如:1.只有一个副本的块(尤其对于2副本的块,下线一台节点)或者这些块有0个active副本;2,单副本在正在退役的节点拥有的块。

L2: block副本实际值远低于配置的值(比如3副本,缺失2个),即副本数不到期望值1/3时的块,这些block会被第二优先级复制。比如4副本的block,有3个丢失或者坏了,它就会比4副本block丢失2个的优先复制。

L3:副本不足没有优先级L2高的那些副本,优先复制。第三优先级。

L4: block满足要求的最小副本数。副本度需求度比L2-L3都低。

L5: 已损坏的块,并且当前有可用的非损坏副本

1.2.2 控制节点掉线RPC风暴的参数

三个参数都是hdfs-site.xml中参数,具体可以参考apache hadoop官网,其实块的复制速度有两个方面决定,一是namenode分发任务的速度,二则是datanode之间进行复制的速度。前者可以理解成入口,后者可以当成出口。

1.入口参数:从namenode层面控制任务分发,这个参数修改必须重启namenode,不需要重启datanode.

dfs.namenode.replication.work.multiplier.per.iteration 

这个参数apache hadoop默认值2,cdh集群默认值10

这个参数决定了当NN与DN进行心跳(3s)发送任务列表时,告诉每个DN可以进行复制的block数量。比如集群有5个节点,这个值设置为5,那么一次心跳namnode可以发送datanode复制的数据块数量是5*5=25块。假如一个节点掉线/退役有365588块block需要复制,则namenode需要多长时间可以将待复制块的任务分发完给datanode呢。

Ambari -web  namenode 参数设置如下: 

极限计算的结果:

任务分发时间=待复制block总数/(集群活跃dn*参数值)*心跳时间

time=365585/(5*5)=14623 次心跳*3s/每次心跳=43870s = 大约 13 hour

所以节点越多,会分发任务越快,分发速度跟节点数和这个参数都成正比

2.出口参数:相比上面从Namenode任务分发控制,下面两个使用datanode层面控制,这两个参数也需要重启namenode

dfs.namenode.replication.max-streams

apache hadoop默认值是2,cdh集群默认20。

这个参数含义是控制datanode节点进行数据复制的最大线程数,从上面我们知道block的复制优先级分成5种。这个参数控制不包含最高优先级的块复制。即除最高优先级的复制流限制

dfs.namenode.replication.max-streams-hard-limit

这个值apache hadoop默认值2,cdh集群默认值40

这个参数含义是控制datanode所有优先级块复制的流个数,包含最高优先级;一般上面和上面两个参数互相的配合使用。

尖叫总结:前者参数控制datanode接受任务的频率,后者这两个参数进一步限制 DataNode 一次完成的最大并行线程网络传输量。具体上面参数的值设定的多少,取决于集群的规模和集群的配置,不能同一而论。一般来说从入口控制比较简单容易些。比如规模500台集群,dfs.namenode.replication.work.multiplier.per.iteration=10,5台DataNode,那么集群一次心跳分发50个block的量,假如集群文件存储全部打散在5台节点,每个节点同时复制10个block(实际会因为副本搁置策略,机架感知等并不会所有的节点都参与数据复制),每个block大小128Mb,则每个节点的网络负载是128*10/3=546Mb/s,那这时候你就要看下结合实际会不会有带宽瓶颈,这么大的网络IO会不会影响正常任务的计算,如果有的话,这个值就要调小点。


二、如何快速节点下线


如何让节点快速下线的本质其实就是提高副本的复制速度。主要还是上面三个参数控制.第一是控制namenode任务分发,其次控制datanode复制速率,前提是不影响正常生产任务的进行。集群规模越小,下线的越慢,比如因为分发的总数会慢很多。

如下是Datanode节点:

 Ambari-web 参数设置:

dfs.namenode.replication.work.multiplier.per.iteration=5
dfs.namenode.replication.max-streams=10   
dfs.namenode.replication.max-streams-hard-limit=20

极限计算的结果:

任务分发时间=待复制block总数/(集群活跃dn*参数值)*心跳时间

time=365585/(5*5)=14623 次心跳*3s/每次心跳=43870s = 大约 13 hour

         由于集群对于小文件的处理不及时导致block 的 数量很大,加上 集群节点只有5台 所以退役一台 Datanode ,需要完成 block 复制的时间 就会很长,但是在可接受范围内。如果是节点相对比较多的节点  ,如上的参数我们继续调整。

在 active namenode 日志我们可以看到每次要复制的block 数为 50 block,需要 完成复制的 bolck 总数为 344341 等信息。

/var/log/hadoop/hdfs/hadoop-hdfs-namenode-namenode.log

2022-12-15 11:41:15,551 INFO BlockStateChange (UnderReplicatedBlocks.java:chooseUnderReplicatedBlocks(395)) - chooseUnderReplicatedBlocks selected 50 blocks at priority level 2; Total=50 Reset bookmarks? false

2022-12-15 11:41:15,552 INFO BlockStateChange (BlockManager.java:computeReplicationWorkForBlocks(1653)) - BLOCK* neededReplications = 344341, pendingReplications = 67.

2022-12-15 11:41:15,552 INFO blockmanagement.BlockManager (BlockManager.java:computeReplicationWorkForBlocks(1660)) - Blocks chosen but could not be replicated = 10; of which 0 have no target, 10 have no source, 0 are UC, 0 are abandoned, 0 already have enough replicas.

2022-12-15 11:41:15,552 INFO blockmanagement.BlockManager (BlockManager.java:rescanPostponedMisreplicatedBlocks(2121)) - Rescan of postponedMisreplicatedBlocks completed in 0 msecs. 18 blocks are left. 0 blocks were removed.

参考博客:如何提高节点下线速度或避免因节点掉线产生网络风暴?_涤生大数据的博客-CSDN博客_dfs.namenode.replication.work.multiplier.per.itera

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

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

相关文章

高等数学(上) —— 一元积分学

文章目录Ch4.不定积分原函数F(x)F(x)F(x)原函数存在定理不定积分∫f(x)dx\int f(x)dx∫f(x)dx不定积分公式不定积分 ⇦⇨ 变上限积分&#xff1a;∫f(x)dx∫0xf(t)dt\int f(x){\rm d}x\int_0^xf(t){\rm d}t∫f(x)dx∫0x​f(t)dtCh5.定积分1.定积分定义定积分的几何意义2.定积分…

ESP32的python开发环境搭建:Thonny+MicroPython

1 Thonny安装 Thonny —— 一个面向初学者的 Python IDE。Thonny良好的支持Microbit、ESP32和树莓派等的开发. 安装下载地址&#xff1a; https://thonny.org/ 2 Micropython安装 MicroPython 是 Python 3 语言的精简实现 &#xff0c;包括Python标准库的一小部分&#xff0…

Vector - VT System - 板卡_VT8006/VT8012

由于最近不幸变为了小*人&#xff0c;因此断更了一周&#xff0c;今天稍有好转&#xff0c;就新加一块大家应该会比较感兴趣的VT板卡硬件介绍吧&#xff0c;也预示着新的开始&#xff0c;马上也要到了元旦&#xff0c;新的一年即将开始&#xff0c;提前在这里祝福大家在新的一年…

JavaPub面试宝典【第22版】

JavaPub面试宝典【第22版】 直接上干货&#xff0c;几百篇原创笔记都在这。 文章列表 &#x1f4da;最少必要面试题 Java基础Java并发入门Java容器JavaWebJVMMySQLMyBatisSpringSpringBootRedisElasticSearchKafkaZookeeperDocker缓存 &#x1f4d6;知识点总结 下面是原创…

linux 下命令

linux 下命令 Linux 是一套免费使用和自 由传播的类 Unix 操作系统&#xff0c; 是一个基于 POSIX 和 UNIX 的多用户、 多任务、 支持多线程和多 CPU 的操作系统。 它能运行主要的 UNIX 工具软件、 应用程序和网络协议。 它支持 32 位和 64 位硬件。 Linux 继承了 Unix 以网络为…

uniCloud云开发----4、uniCloud云开发进阶使用方法

uniCloud云开发进阶使用方法前言1、云对象的importObject的创建和使用(1&#xff09;创建云对象&#xff08;2&#xff09;编辑云对象&#xff08;3&#xff09;在.vue文件中调用云对象&#xff08;4&#xff09;在.vue文件中调用方法2、客户端直接连接数据库(1)直接在客户端引…

设计模式-牛刀小试02

前言 本文为datawhale2022年12月组队学习《大话设计模式》最后一次打卡任务&#xff0c;本次完成homework2。 【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern 一、任务描述 1.1 背景 小李已经是一个工作一年的初级工程师了&#xff0c;他所在的公…

sqlite wal 分析

动手点关注干货不迷路sqlite 提供了一种 redo log 型事务实现&#xff0c;支持读写的并发&#xff0c;见 write-ahead log&#xff08;https://sqlite.org/wal.html&#xff09;。本文将介绍 wal 原理&#xff0c;并源码剖析 checkpoint 过程&#xff0c;同时讨论下 wal 使用中…

知行之桥EDI系统如何通过ZIP端口压缩文件?

在EDI项目当中&#xff0c;对于IT技术不够成熟或设备不够完善的用户来说&#xff0c;EXCEL方案是较为适中的选择。收到合作伙伴发来的850订单之后&#xff0c;将订单数据转换为EXCEL&#xff0c;再将EXCEL发送至用户指定的邮箱。若每条订单单独发送至邮箱&#xff0c;当订单量大…

#榜样的力量#《新冠战“疫”——2022中国数据智能产业最具社会责任感企业》榜正式发布...

‍数据猿出品数据猿此次推出的#榜样的力量#《新冠战“疫”——2022中国数据智能产业最具社会责任感企业》榜单/奖项为公益主题策划活动。旨在为正能量助威&#xff0c;为中国数据智能产业中具有社会责任感的典型性企业发声。数据智能产业创新服务媒体——聚焦数智 改变商业新冠…

66、【链表】leetcode——142. 环形链表 II(C++、Python版本)

题目描述 方法一&#xff1a;哈希表 C版本 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detectCycle(ListNode *head) {unord…

年终小结:苟住

大家好&#xff0c;我是一哥&#xff0c;新的一年又要到来了&#xff0c;一个词总结下今年的状态 01 工作 2022真的比较难&#xff0c;作为互联网技能从业人员&#xff0c;相信大家一定经历了很多。这一年虽然我没有被毕业&#xff0c;但也经历了公司的业务调整&#xff0c;曾…

C51 --串口通信

3.2.1 串口的连接方式 RXD&#xff1a;数据输入引脚&#xff0c;接受数据&#xff1b;STC89系列对应P3.0口&#xff0c;上官一号有单独引出 TXD&#xff1a; 数据发送引脚&#xff0c;数据发送&#xff1b;STC89系列对应P3.0口&#xff0c;上官一号有单独引出 接线方式&…

2022 IoTDB Summit:IoTDB PMC 田原《大规模并行处理与边缘计算在 Apache IoTDB 中的实践》...

12 月 3 日、4日&#xff0c;2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本&#xff0c;并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例&#xff0c;深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

带头双向循环链表的增删改查

目录&#x1f921;前言&#x1f60a;带头双向循环链表&#x1f44d;链表实现&#x1f620;插入-头插&#xff0c;尾插&#xff0c;随机插✅删除-头删&#xff0c;尾删&#xff0c;随机删&#x1f602;链表搜索和链表修改&#x1f4a1;总结&#x1f921;前言 本篇博客主要是介绍…

Qt编写雷达模拟仿真工具(模拟点/歼击机/航母/发射导弹/爆炸效果/激光雷达等)

一、简单介绍 雷达模拟仿真工具&#xff0c;主要通过模拟点模拟相关物体&#xff0c;方位、航向角、距离、速度&#xff0c;并且显示相关详情信息可建立跟踪线建立与模拟点联系。可自定义更换模拟点背景达到更加逼真效果&#xff0c;如歼击机&#xff0c;航母发射导弹效果&…

单例模式,适配器模式,迭代器模式,工厂模式(C++实现)

设计模式就相当于编程中的“孙子兵法”&#xff0c;是经过很久的时间以及各路大神总结出来的多种实用&#xff0c;高效的业务设计中的套路; 单例模式 一个类只能创建一个对象的情况下的一种设计模式&#xff08;eg&#xff1a;服务器只有一个&#xff09;&#xff0c;即单例模…

【论文阅读】《知识图谱研究综述》;Knowledge Graph:概念及主要应用,主要特征、构建的主要技术、未来研究方向。

目录 1. 文章来源2. 简介3. 什么是知识图谱4. Knowledge Graph 主要特征5. Knowledge Graph 构建的主要技术6. Knowledge Graph 未来研究方向1. 文章来源 该paper来自于知网,请尊重原创,这里仅作为学习笔记~ 2. 简介 知识图谱将知识库以一种图谱的形式展现出来,使知识具有…

opencv-python常用函数解析及参数介绍(一)——图像读取及其通道与灰度

opencv-python中一些常用函数解析及参数介绍前言1.读图片读彩图读灰度图2.显示图片显示彩图显示灰度图灰度图与彩图的区别从彩图中分离单通道通道合并3.保存图片4.灰图的通道分离5.读取视频前言 本文将简单介绍opencv-python中的图像以及视频的读取&#xff0c;并且介绍灰度图…

Hello 2023

年初到年尾&#xff0c;感觉刚写完《Hello 2022》&#xff0c;就要迎接2023了。今天是2022最后一天&#xff0c;本来是元旦假期的第一天&#xff0c;奈何要来公司加班&#xff0c;抽个时间来回顾下 2022 吧。 2022 年和2021 一样也是里程碑的一年&#xff0c;完成了两件大事&a…