【HDFS】自动踢除pipeline中的慢节点

写在前面:
之前发过一篇文章,【HDFS】HDFS-16348:将慢节点标记为badnode进而从pipeline中踢除并进行pipeline恢复。

本文和这篇文章中使用的方法思路差不多,区别在于指标的统计以及慢节点状态的判定方面。在我们公司的线上代码里,两个patch是互相兼容的,可以一起工作。

首先用通俗的话介绍一下整体的思路吧,读者也可先阅读一下之前的那篇文章,效果更佳。

整体思路: 我们收集整个写过程中的每个阶段的耗时(dn->下游dn),然后返回给客户端,在客户端侧做收集和统计工作,如果判断某个节点是慢节点,那么就把它给剔除掉,这样就不会因为一个节点导致整体的写入变慢了。这就是整体思路,很简单。

那么问题来了:

  1. 如何统计网络和磁盘耗时并发送给客户端呢?
  2. 如何判断某个datanode是慢节点呢?
  3. 如何踢除慢节点,再补充新的节点到pipeline呢?

接下来我们就来依次解答这三个问题。

一、如何统计网络和磁盘耗时并发送给客户端呢?

因为HDFS写数据时是个pipeline的结构,所以我们需要把下游节点统计到的指标信息发送给上游节点,由上游节点进行汇总,最终由pipeline中最上游的datanode发送给客户端。

那如何把统计信息从下游Datanode发送到上游是我们必须要解决的问题。根据写数据pipeline的模型,上游向下游发送的每一个Packet都需要收到Ack信息后才能确定发送成功或者失败,因此我们在Ack响应体里加上我们需要传递给上游的信息就OK了,这部分的实现是参考HDFS现有代码的框架的,后面再详细说。具体做法如下:

你可能感兴趣的:(【HDFS】自动踢除pipeline中的慢节点)