DataNode节点下线速度优化

这篇具有很好参考价值的文章主要介绍了DataNode节点下线速度优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DataNode节点下线速度优化

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁

🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

 目录

一、节点掉线或退役

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

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

1.2.1 Datanode的block复制

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

二、如何快速节点下线


一、节点掉线或退役


背景:5台数据节点,存储40T数据 block数1120万块左右,集群带宽限制200M/s,标准节点配置是4*5T。

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


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

DataNode节点下线速度优化

节点掉线:比如强制停止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呢。

DataNode节点下线速度优化

Ambari -web  namenode 参数设置如下: 

DataNode节点下线速度优化

极限计算的结果:

任务分发时间=待复制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 一次完成的最大并行线程网络传输量。具体上面参数的值设定的多少,取决于集群的规模和集群的配置,不能同一而论。一般来说从入口控制比较简单容易些。比如规模5台集群,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节点:

DataNode节点下线速度优化

 Ambari-web 参数设置:

DataNode节点下线速度优化

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.

DataNode节点下线速度优化

参考博客:如何提高节点下线速度或避免因节点掉线产生网络风暴?_涤生大数据的博客-CSDN博客_dfs.namenode.replication.work.multiplier.per.itera文章来源地址https://www.toymoban.com/news/detail-414764.html

到了这里,关于DataNode节点下线速度优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud(4) Eureka 如何主动下线服务节点

    一共有三种从 Eureka 注册中心剔除服务的方式: 1.直接停掉客户端服务 执行如下命令, pid 表示客户端服务进程ID。 默认情况下,如果 Eureka Server 在 90s 内没有收到 Eureka 客户端的续约,它会将实例从其注册表中删除。 这种做法的缺点在于,如果客户端已经停止了运行,但仍然

    2024年02月16日
    浏览(37)
  • 解决Hadoop完全分布式集群中从节点jps没有datanode节点问题

    当用start-dfs.sh和start-yarn.sh后,在slave节点(从节点)中用jps命令查看进程 正常情况: 有时候可能发现没有Datanode,即只有两项(第一项和最后一项)。原因可能是 重复格式化 namenode 后,导致 datanode 的 clusterID 和 namenode 的 clusterID 不一致。 解决方法: 在master节点(namenode): 找到你

    2024年02月06日
    浏览(56)
  • 解决hbase节点已下线,但在status中显示为dead问题

    工作中需要下线4台hbase小节点,下线完成后使用status 命令查看,有一台为dead状态: 使用status \\\'detailed\\\' 查看,发现“hd-03\\\"这台节点是dead。   检查各节点配置文件无误,并使用  /opt/hbase/bin/hbase-daemon.sh restart master  重启两个hbase master节点后依然没用。 参考这篇博客: 解决HBase

    2024年02月13日
    浏览(34)
  • 解决Hadoop伪分布式集群jps没有datanode节点问题

    在启动Hadoop时,通过jps目录发现没有datanode进程。

    2024年02月13日
    浏览(56)
  • hadoop集群slave节点jps后没有datanode解决方案

    这个问题是重复格式化造成的,重复格式化namenode造成datanode中的VERSION文件中clusterID与主节点的不一致。 1.关闭集群 2.找到安装hadoop的文件夹,我的是(/usr/local/hadoop)再找到里面的tmp/dfs/name/current,打开VERSION查看并复制clusterID的内容。 操作:在master里输入命令 3.切换到slave节点,

    2024年02月11日
    浏览(58)
  • hadoop集群中增加新节点服务器(DataNode + NodeManager)方案及验证

    现根据业务需要,需要在原有的3台完全分布式的集群(hadoop1、hadoop2、hadoop3仨节点)增设一台新的服务器节点(hadoop4),以下是在原有的完全分布式hadoop集群中增设新节点( DataNode + NodeManager )的部署步骤。 基础服务配置 hadoop4上依次执行以下步骤: 1)用户:重置root用户密

    2024年01月19日
    浏览(41)
  • WebPack优化 Webpack构建速度优化

    目录 1 常用的loader和plugin 2 WebPack多入口配置: 3 如何抽离压缩css文件 4 webpack如何抽离公共代码和第三方代码  5 webpack如何实现异步加载JS (懒加载) 6  module chunk bundle 的区别 7  webpack优化构建速度 hard-source-webpack-plugin 8 webpack 优化产出代码 9 什么是Tree-Shaking 10 ES6 Module和 Commo

    2024年02月11日
    浏览(46)
  • Android启动速度优化

    本节主要内容:了解APP启动流程、启动状态、查看启动时间、CPU Profile定位启动耗时代码、StrictMode严苛模式检测不合理写法、解决启动黑白屏问题。 一、APP启动流程 ①用户点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求; ②system_server进程接收到

    2024年02月15日
    浏览(38)
  • 优化SpringBoot程序启动速度

    Spring Boot 程序优化 一、延迟初始化Bean 一般在 SpringBoot 中都拥有很多的耗时任务,比如数据库建立连接、初始线程池的创建等等,我们可以延迟这些操作的初始化,来达到优化启动速度的目的。Spring Boot 2.2 版本后引入 spring.main.lazy-initialization 属性,配置为 true 会将所有 Bean

    2024年02月20日
    浏览(40)
  • 优化python程序执行速度

         最近使用python编写的一个蓝牙应用程序,在使用过程中发现传输大量数据时会产生丢包,导致无法接收到完整的数据包。蓝牙接收程序的代码如下。      首先怀疑的是代码逻辑有问题,经过阅读代码与测试,发现代码逻辑正确。其次怀疑设备的蓝牙驱动程序有问题,

    2024年02月06日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包