美文网首页
【HDFS】DFSPacket中lastPacketInBloc

【HDFS】DFSPacket中lastPacketInBloc

作者: 小北觅 | 来源:发表于2023-12-13 18:00 被阅读0次

这篇文章介绍了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。如下代码所示:

相关文章

网友评论

      本文标题:【HDFS】DFSPacket中lastPacketInBloc

      本文链接:https://www.haomeiwen.com/subject/fkabgdtx.html