这篇文章介绍了DFSPacket对象的lastPacketInBlock字段相关的知识。
【HDFS Client】DFSPacket对象什么情况下是lastPacketInBlock?
本文继续深挖这个字段在HDFS Client写数据时的重要作用。
可以这么说,如果这个lastPacketInBlock出问题的话,是会影响增量块汇报(IBR)的,继而导致Block Missing丢块的问题。
我们先给出结论,lastPacketInBlock的两个重要作用:
1、在客户端侧控制endBlock,结束一个block,进而向namenode新申请新的块。
2、在datanode侧,控制block的finalize。
一、DataNode侧的作用
因为last packet in block只是一个标记packet,并没有真实的数据。
所以,在datanode侧,如果发现当前receive的packet是lastPacketInBlock的话,就会看是否有sync标记,
如果需要sync block,则flushOrSync(true, seqno),把块给同步到磁盘上。
if (lastPacketInBlock || len == 0) {
if(LOG.isDebugEnabled()) {
LOG.debug("Receiving an empty packet or the end of the block " + block);
}
// sync block if requested
if (syncBlock) {
flushOrSync(true, seqno);
}
}
DataNode侧的PacketResponder线程接收到下游的PipelineAck之后,拿到lastPacketInBlock标记。
如果为true。则调用finalizeBlock方法,去finalizeBlock,closeBlock,触发IBR(notifyNamenodeReceivedBlock)通知NameNode。如下代码所示: