本文的主要内容是介绍这个PR(Pull Request):HDFS-16348. Mark slownode as badnode to recover pipeline (#3704)
通过本文可以获得如下知识:
- datanode如何获得自己是SLOW状态的?
- PipelineAck类的字段详解。
- Client侧将慢datanode标记为bad datanode后剔除掉以及添加一个新datanode到pipeline的过程。
先说下这个PR的前置基础知识以及主要思路,后面再详细分析源码:
在HDFS中,Datanode会定期地向Namenode进行心跳汇报。Namenode接收到Datanod的心跳后,会发送心跳响应给Datanode,心跳响应中会包含Datanode指令、此Datanode是否是慢节点等信息。Datanode接收到Namenode的心跳响应后,解析其中的内容,拿到是否是SLOW节点的信息。
为什么这里Datanode SLOW的信息是由Namenode侧返回的呢? 答:因为一个datanode并不能知道自己是不是慢节点,它慢是由其它的datanode或客户端在读写的时候统计出来的读写时间超过某个配置的阈值才叫慢,会把慢datanode信息汇报给namenode,然后namenode侧会做一个信息聚合,当多个datanode或者客户端都认为某个datanode慢的时候,那它大概率就真是一个慢节点。
好,现在我们知道Datanode可以从心跳响应中获得自己是不是慢节点的信息。我们假设写数据pipeline中的某一个或多个Data
|