HDFS在异常写入时是怎么保证不出现DN中数据重复的?

假如有三个DN节点,按机架距离感知依次为d1,d2,d3。传输某一个packet时, d2长时间没有返回ack,NN认为d2故障,剔除掉d2重新建立数据通道。同时客户端将发送队列中的packet返回到等待队列,这样做的目的是为了保证d3不出现数据缺失。

但是我的d1在故障前已经接受到了最新的1个packet并且已经给NN发送了ack,发送队列回滚后,重新与d1建立通道并发送数据,这样做应该会造成d1中的数据重复。

所以这里解决方式可能有两种选择,一个是通过NN根据返回ack发现数据重复,请求d1删除相应数据;二是d1根据接受到的packet的校验和实现去重。
但是这两种方式是猜想,也没有查到相应的资料,是否还有其他解决方式?

还有一个问题为什么csdn问答里面选择问题标签的时候没有大数据或者hdfs的标签,也不能自定义。

通讯原理不知道你学过没有

就是这种情况为了可靠传输,必须通过牺牲有效性来达成。也就是说,如果长时间没有得到数据,就认为数据丢失(不完整的数据发生回滚),即使之后再收到了数据也不承认。
这样对你的数据增加事务性锁,保证读取-修改-写入的操作是原子性的。